ログインしていない場合のアクセス制限
ログインしていないと特定のアクションを作動することができないようにする。
その後ログインページへリダイレクトさせる。
・postsコントローラの全アクション
・usersコントローラのindex, show, edit, updateアクション
その場合にエラーメッセージを表示させる。
まずログインの条件をつけてみる
どうすればよかったか?
if @current_user
とかにすれば良かったと思う。
じゃない。
before_action
を使えば良かったと思う。
そこでアクションをする前にメソッドを作動させる。
どのようなメソッドをつけるのか?
ログインしていることがわかればいいからapplication_controller
のset_current_user
を使えばいいのか? それにonlyをつければいいのかな。
やってみよう。
before_action :set_current_user, only:[:index :show :edit :update]
と書いてみた。
がエラーメッセージを表示させなくてはならないことに気づく。
なので新しくメソッドを作成をしようと思う。
どのようなメソッドにすればよいだろうか?
def check_current_user
if @current_user
else
flash[:notice] = "ログインが必要です"
redirect_to("/login")
end
end
ログインの可否を問い、else
でエラーメッセージを表示させるか?
ifも空だし何か腑に落ちない。
その場合@current_user
を使いidと照合し...んーーわからん。
答えを見た。
if @current_user == nil
flash[:notice] = "ログインが必要です"
redirect_to("/login")
end
@current_user
が空の場合を想定するのか。だからelse
が必要ないのか。
しかし@current_user == nil
に慣れていないので中身が記録がない時にこれを用いるのか。
否定的なif文だな。
if @current_user
は肯定的if文だと自分の中で解釈した。
これらを使い分けることによってなんとかでない場合
を書けるようになると思う。
authenticate_user
というメソッド名は統一なのだろうか?
class PostsController < ApplicationController
before_action :authenticate_user
.
.
.
end
class UsersController < ApplicationController
before_action :authenticate_user, only:[:index :show :edit :update]
.
.
.
end
ログインしていないユーザーがusersコントローラのindexアクションにアクセスした時に、ログインページへリダイレクトしてください。
すぐに答えを見てしまった。これから頑張る。
only
の部分がおかしいのがわかる。
ログインページへリダイレクトしてください。と書いてあるためbefore_action
が作動していないことがわかる。
class UsersController < ApplicationController
before_action :authenticate_user, {only:[:index, :show, :edit, :update]}
.
.
.
end
{}
と,
がついていなかった。