web-dev-qa-db-ja.com

条件付きbefore_action / before_filterには「proc」が必要ですか?

見よ、before_filter

class ThingController < ApplicationController
  before_filter :check_stuff, :if => proc {Rails.env.production?}
end

最近のコードレビュー中に、「これを機能させるにはprocが必要ですか?」と尋ねられました「はい」ですが、それは合理的な質問であり、Railsのドキュメントやガイド、またはbefore_filter(現在はbefore_actionのエイリアス)を使用した条件の使用に関する何かを参照して回答するつもりでした。

何も見つかりませんでした。 Action Controller Guide:only/:exceptに言及していますが、:if/:unlessには言及していません。

それに失敗すると、これをカバーするコードのどこかに指摘できますか?簡潔に言及しました ここ ですが、それは:only:exceptではなく、:if:unlessの処理方法の詳細です。

39
MrTheWalrus

Railsガイド: http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks

Procが機能するために必ずしも必要ではないことが判明しました。

:ifおよび:unlessオプション。シンボル、文字列、ProcまたはArrayを使用できます。

あなたの場合、おそらくあなたは逃げることができます

before_action :check_stuff, if: "Rails.env.production?"

Railsドキュメントで物事を見つけるのは面倒な場合がありますが、少なくともこのような質問は、StackOverflowのインデックスが適切で検索ランキングが高いため、時間の経過とともに物事を見つけやすくなります。

59
Dennis

Rails 5.2以降では、現在受け入れられている回答は無効になり、条件に文字列を渡すことは失敗します。

非推奨の警告:文字列を:ifおよび:ununに渡すことは条件付きオプションが非推奨であり、Rails 5.2で置換せずに削除されます。

今後、procは元の質問のように条件を追加する最良の方法です。

class ThingController < ApplicationController
  before_action :check_stuff, :if => proc {Rails.env.production?}
end
20
Upvote Me

私は以前に私のコードでこれを行いました。この例がお役に立てば幸いです。 ifステートメントを使用できても、それがここで行ったような別のメソッドを指している必要があります。

class Admin::ArticlesController < ApplicationController
  before_filter :deny_access, :unless => :draft_and_admin?

  def show
    @article = Article.find(params[:id])
  end

  protected

  def draft_and_admin?
    Article.find(params[:id]).draft? && current_user.admin?
  end
end
8
jimagic

Staby lambdaの使用をお勧めします

class ThingController < ApplicationController
  before_action :check_stuff, if: -> {Rails.env.production?}
end

これは、Upvote Meの答えとほぼ同等です。

0
Imran