読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【73日目】【1日20分のRailsチュートリアル】【第8章】Sessionsコントローラとログインフォームの作成

Ruby on Railsチュートリアル(第3版)

今日は「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にアクセス。

f:id:kt_zoe:20161116123520p:plain

表示されました!

今日の作業時間は【27分】

次は「8.1.3 ユーザーの検索と認証」から。