🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

2940閲覧

before_actionのonlyがうまく行かない

tomtom1

総合スコア168

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/12/20 15:14

###実現したいこと
forbid_login_userのbefore_actionで指定したアクションのみで適用させたい。

Controller

1class UsersController < ApplicationController 2 before_action :authenticate_user, {only: [:index, :show, :edit, :update]} 3 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} 4 before_action :ensure_correct_user, {only: [:edit, :update]}

現在、top.htmlやabout.htmlなど、onlyで指定していないページにも関わらず、session[:user_id]があれば勝手に/posts/indexにログインしてしまいます。

###コード

Routes

1get "/" => "home#top" 2get "about" => "home#about" 3root "home#top" 4get "/login" => "users#login_form" 5post "login" => "users#login" 6post "users/create" => "users#create" 7get "signup" => "users#new"

Controller

1class ApplicationController < ActionController::Base 2 before_action :set_current_user 3 4 def set_current_user 5 @current_user = User.find_by(id: session[:user_id]) 6 end 7 8 def authenticate_user 9 if @current_user == nil 10 flash[:notice] = "ログインが必要です" 11 redirect_to("/login") 12 end 13 end 14 def forbid_login_user 15 if @current_user 16 flash[:notice] = "すでにログインしています" 17 redirect_to("/posts/index") 18 end 19 end 20end

下記のURLでも記載の通り、やはりbefore_actionでonlyと限定すれば、forbid_login_userは起きないはずなのですが...。
https://qiita.com/jonnyjonnyj1397/items/4691d723860a8d927d15

もしかしたら、ApplicationController内でforbid_login_userが着火されてしまって、onlyで限定できていない状態なのかとも考えています。
お分かりの方、ぜひお力添えを宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

class HomeController < ApplicationController before_action :forbid_login_user, {only: [:top, :about]} def top end def about end end

HomeControllerにこのコードがないからです
top.htmlやabout.htmlは両方ともHomeController下にあるためUserControllerでのbefore_actionとは無関係です

PS routes.rbの「get "/" => "home#top」"と「root "home#top"」はダブっているのでどちらか一つでよいかと思います

投稿2019/12/21 01:31

編集2019/12/21 01:35
story_aniki

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtom1

2019/12/21 08:51

HomeControllerでしたか!把握しました!有難うございます。 今回は、top/aboutでは自動ログインをしたくないという事でしたので、 記載のforbid_login_user, {only: [:top, :about]}を削除する事で解決しました。 ありがとうございます。
guest

0

「勝手に/posts/indexにログインしてしまいます」
のログインする という意味ですが

  1. /posts/index はloginしなければ見せないページである
  2. session[:user_id]があれば /posts/indexにアクセスするとログイン画面経由せずに見えてしまう

ということでしょうか?

application_controllerのbefore actionでset_current_userが呼ばれています。このため session[:user_id]があれば ログイン済として扱われるようになります。

/posts/indexにアクセスした時に、どのようになりたいのでしょうか?

投稿2019/12/20 21:19

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtom1

2019/12/21 08:49

ご回答有難うございます! topやaboutのページに関しては、自動でログインをしたくなかったです。わかりづらくて申し訳ありません! 原因は、HomeControllerに、before_action :forbid_login_user, {only: [:top, :about]}に記載があったためでした。
guest

0

すべて{}が不要だと思います。

before_action :authenticate_user, only: [:index, :show, :edit, :update]

にしてみたらどうでしょうか?

投稿2019/12/20 15:42

k-810

総合スコア192

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2019/12/20 21:21

only: [] は「最後のhashの引数」ですから、{}を省略出来ますが、省略しないのが元々ですから、つけてもつけなくても同じです。
tomtom1

2019/12/21 08:45

ご回答ありがとうございます!winterboumさんのおっしゃる通り、変化ありませんでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問