rails tutorial 8章まとめ

おはようございます。

つい先日、rails tutorial8章目を終えました。
2周目だったのですが、それでも理解度は70~80%くらいでした笑
なので、一度文章でまとめてみようと思います。

rails tutorial 8章

第8章はセッションについてでした。

sessionとは

sessionとはwebサイトにアクセスしてサイトを閉じるまでに行う一連の動作のことを言います。
また、サイトを開いていても一定時間が経過してしまうと2sessionにカウントされることもある。

sessionの実装

早速sessionの実装について書いていきたいと思います。

  1. ログインフォームの作成
    ログイン、ログアウトの要素を実装するためにsessionsコントローラーを作成します。

    rails g controller sessions 

    これでsessionsコントローラーを作成できました。
    次にログインフォームを作成します。
    routeとcontrollerは以下の通りです。
    route

    get '/login', to:sessions#new

    controller

    def new
    end

    次にhtmlですが、フォームにはform_forヘルパーを使います。

    <%= form_for() do |f| %>
    ・
    ・
    ・
    <% end %>

    form_forヘルパーの引数にはどのアクションに飛んで欲しいか記述する必要があります。
    また、ユーザーの作成の際には@userを引数に取るだけで「/usersのPOSTアクションに飛んでね。」と指示できましたが、sessionsにはモデルがないのでこのようには記述できません。

    <%= form_for(:session, url:login_path) do |f| %>
    ・
    ・
    ・
    <% end %>

    となります。
    routeに記述したことで名前付きルートが使用できます。
    また、入力欄はfオブジェクトによってhtmlフォームに対応する要素を作り出します。
    よって、入力欄のコードは以下のようになります。
    new.html.erb

    <%= 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 %>
  2. ユーザー検索と認証
    最初に無効な入力な処理を行います。

    def create
    render 'new'
    end

    ログインフォームから受け取る値はparamsに入っています。
    params[:session]
    また、sessionはemail,passwordの二つのキーを持っています。
    つまり、createが受け取る値はparams[:session][:email],params[:email][:password]の二つです。
    これを使い認証していきます。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    #ログイン成功
    else
    render 'new'
    end
    end

    find_byメソッドで該当するユーザーを検索します。
    authenticateメソッドで入力されたパスワードのハッシュ化された値と登録されている値が一致しているか確認しています。
    一致していればログインできます。

  3. ログイン
    認証は済んだので次はセッションを実装していきます。
    また、ここからたくさんのメソッドを書いていくのでそれらはhelperにまとめます。
    ログインにはsessionメソッドを使います。

    session[:user_id] = user.id

    このメソッドは使い回せるように関数にします。
    helper

    def log_in(user)
    session[:user_id] = user.id
    end

    このヘルパーメソッドをcreateアクションに記述して完成です。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    log_in user
    redirect_to user
    else
    render 'new'
    end
    end
  4. ユーザーIDを他のページでも使えるようにする
    別のページでも現在のユーザーを呼び出すためにはsession[:user_id]からユーザー検索を行えばいいです。

    def current_user
    if session[:user_id]
    User.find_by(id: session[:user_id)
    end
    end

    また、何度も上のメソッドを行うのは無駄が多いのでcurrent_userがnilの時のみ行うようにします

      if @current_user.nil?
    @current_user = User.find_by(id: session[:user_id])
    else
    @current_user
    end

    最後に上記のif文をまとめます。

    def current_user
    if session[:user_id]
    @current_user ||= User.find_by(id: session[:user_id])
    end
    end
  5. ログアウト機能の実装
    最後にログアウト機能を実装します。
    helper

    def log_out
    session.destroy[:user_id]
    @current_user = nil
    end
    def destroy
    log_out
    redirect_to root_url
    end

以上でログイン、ログアウト処理の実装が完了しました。
文にしたことで多少は整理できたはず。。。笑

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です