見よ、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
の処理方法の詳細です。
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のインデックスが適切で検索ランキングが高いため、時間の経過とともに物事を見つけやすくなります。
Rails 5.2以降では、現在受け入れられている回答は無効になり、条件に文字列を渡すことは失敗します。
非推奨の警告:文字列を:ifおよび:ununに渡すことは条件付きオプションが非推奨であり、Rails 5.2で置換せずに削除されます。
今後、procは元の質問のように条件を追加する最良の方法です。
class ThingController < ApplicationController
before_action :check_stuff, :if => proc {Rails.env.production?}
end
私は以前に私のコードでこれを行いました。この例がお役に立てば幸いです。 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
Staby lambdaの使用をお勧めします
class ThingController < ApplicationController
before_action :check_stuff, if: -> {Rails.env.production?}
end
これは、Upvote Meの答えとほぼ同等です。