Behold, a before_filter
:
class ThingController < ApplicationController before_filter :check_stuff, :if => proc {Rails.env.production?} end
During a recent code review, I was asked, "Is the proc
is required for this to work?" The answer appears to be 'yes', but it's a reasonable question, and I had intended to answer it by referring to the Rails docs or guides or something on the use of conditionals with before_filter
(now an alias of before_action
).
I couldn't find any. The Action Controller Guide mentions :only
/:except
, but not :if
/:unless
.
Failing that, is there somewhere in the code I can point to that covers this? It's mentioned briefly here, but that's more about how :only
and :except
are handled, rather than :if
or :unless
.
before_filter/before_action: means anything to be executed before any action executes. Both are same. they are just alias for each other as their behavior is same.
The only option of before_action defines one action OR a list of actions when the method/block will be executed first. The set_newsletter_email method will be called just before the show and edit actions. The opposite option except define when NOT to execute the method/block.
Found it on Rails Guides: http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks
Turns out a Proc
isn't always required for it to work.
the
:if
and:unless
options, which can take a symbol, a string, aProc
or anArray
.
So in your case you could probably get away with
before_action :check_stuff, if: "Rails.env.production?"
Finding things in Rails documentation can be a pain sometimes, but at least questions like this make things easier to find over time since StackOverflow is well indexed and has high search rankings.
From Rails 5.2 onwards, the current accepted answer is no longer be valid, and passing a string to the conditional will fail.
DEPRECATION WARNING: Passing string to :if and :unless conditional options is deprecated and will be removed in Rails 5.2 without replacement.
Going forward, a proc is now the best way to add a conditional like in the original question:
class ThingController < ApplicationController before_action :check_stuff, :if => proc {Rails.env.production?} end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With