【73日目】【1日20分のRailsチュートリアル】【第8章】Sessionsコントローラとログインフォームの作成
今日は「8.1.1 Sessionsコントローラ」から。
8.1.1 Sessionsコントローラ
最初に、Sessionsコントローラとnewアクションを生成します。
作りました。
$ rails generate controller Sessions new
newアクションを生成すると、それに対応するビューも生成されます。
createやdestroyには対応するビューがない (=不要) なので、無駄なビューを作成しないためにここではnewだけを指定しています。
createやdestroyアクションも作るけど、rails generate
で作るとビューも生成されてしまうので指定しない、ってことかな。
Usersリソースのときは専用のresourcesメソッドを使用してRESTfulなルーティングを自動的にフルセットで利用できるようにしました (リスト7.3) が、
Sessionリソースではフルセットはいらないので、「名前付きルーティング」だけを使用します。rails generate controllerで生成された不要なルートは、このリストから削除してあります。
不要なルートってこれのことかな。
config/routes.rb
get 'sessions/new'
config/routes.rb
をリスト8.1に合わせます。
Rails.application.routes.draw do root 'static_pages#home' get 'help' => 'static_pages#help' get 'about' => 'static_pages#about' get 'contact' => 'static_pages#contact' get 'signup' => 'users#new' get 'login' => 'sessions#new' post 'login' => 'sessions#create' delete 'logout' => 'sessions#destroy' resources :users end
これまでに名前付きルーティングをだいぶ追加してきたので、ここでアプリケーションの全ルーティングを表示できると便利です。
rake routesコマンドを実行すればいつでもルーティングのリストを表示できます。
色んなコマンドあるんだなぁ。
$ bundle exec rake routes Prefix Verb URI Pattern Controller#Action root GET / static_pages#home help GET /help(.:format) static_pages#help about GET /about(.:format) static_pages#about contact GET /contact(.:format) static_pages#contact signup GET /signup(.:format) users#new login GET /login(.:format) sessions#new POST /login(.:format) sessions#create logout DELETE /logout(.:format) sessions#destroy users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy
8.1.2 ログインフォーム
コントローラとルーティングを定義したので、今度は新しいセッションで使用するビュー、つまりログインフォームを整えましょう。
ログインフォームは [Email] と [Password] の2つのフォームを用意する。
ログインフォームで入力した情報に誤りがあったときは、ログインページをもう一度表示してエラーメッセージを出力します。
(中略) セッションはActive Recordオブジェクトではないので、上のようにActive Recordがよしなにエラーメッセージを表示してくれるということは期待できません。
ユーザー登録時のエラーメッセージはActive Recordが生成してくれてたけど、セッションはそんな仕組みないので自前で作るのかな。
セッションフォームとユーザー登録フォームの最大の違いは、セッションにはSessionモデルというものがなく、そのため@userのようなインスタンス変数に相当するものもない点です。
(中略) 適切なform_forを使用することで、リスト7.13のユーザー登録フォームを参考にして、リスト8.2に示したようなモックアップに従ったログインフォームを簡単に作成できます。
ユーザー登録フォームとまるっきり一緒、は無理だけど、セッションに合ったform_for
を使うことでほぼ同等のコードでビューが作成できるっぽい。
app/views/sessions/new.html.erb
<% provide(:title, "Log in") %> <h1>Log in</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(:session, url: login_path) do |f| %> <%= f.label :email %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.submit "Log in", class: "btn btn-primary" %> <% end %> <p>New user? <%= link_to "Sign up now!", signup_path %></p> </div> </div>
ログインフォームのビューを確認してみます。
サーバーを起動して
$ rails server -b $IP -p $PORT
<ローカルアドレス>/login
にアクセス。
表示されました!
今日の作業時間は【27分】。
次は「8.1.3 ユーザーの検索と認証」から。