ログインフォーム
これまで習ってきた form_for
は form_for(@user)
のようにインスタンス変数を指定して、そのインスタンス変数をコントローラに渡していた。
ログインフォームではリソースの名前( : session
)とそれに対応するURLを指定する。( session
にはモデルがないため。)
<%= form_for(:session, url: login_path) do |f| %>
ログインフォームのコード
<%= form_for(:session, url: login_path) do |f| %> <div class="form-group"> <%= f.label :email, 'Email' %> <%= f.email_field :email, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :password, 'Password' %> <%= f.password_field :password, class: 'form-control' %> </div> <% end %>
上のフォームで入力した値を session
コントローラ側では、下のようにして取り出すことができる。
params[:session][:emnail] params[:session][:password]
ログイン・認証機能
def login(email, password) @user = User.find_by(email: email) if @user && @user.authenticate(password) # ログイン成功 session[:user_id] = @user.id return true else def current_user @current_user ||= User.find_by(id: session[:user_id]) end
ログインが成功すると、 session[:user_id] = @user.id
が実行される。
つまり自分のアカウントのインスタンスの id
が session
(ハッシュ)に登録される。
(sessionとは、サーバ側でログイン情報を保管して置く場所のこと。)
current_user
メソッドは現在ログインしているユーザを取得するメソッド。
@current_user
に user
インスタンスが入って入れば、それを返す。
入っていなければ、session[:user_id]
の値をUserモデル(全ユーザーのリスト)から探して、
現在ログインしているユーザを特定し、そのインスタンスを返す。
login成功したら、@current_user
の中には必ずインスタンスが入ってる。
session[:user_id]
にidが保存され、current_user
メソッドがそれを探すから。
!!current_user
とは、 current_user
に何も入ってないときは nil
を返す。
!nil = true
!true = false
つまり current_user
に何も入ってないときは、 !!current_user
は false
を返す。