Path: | lib/merb-core/controller/abstract_controller.rb |
Last Update: | Tue Aug 12 19:23:16 -0600 2008 |
Note that the over-use of "_" in Controller methods is to avoid collisions with helpers, which will be pulled directly into controllers from now on.
before is a class method that allows you to specify before filters in your controllers. Filters can either be a symbol or string that corresponds to a method name to call, or a proc object. if it is a method name that method will be called and if it is a proc it will be called with an argument of self where self is the current controller object. When you use a proc as a filter it needs to take one parameter.
after is identical, but the filters are run after the action is invoked.
before :some_filter before :authenticate, :exclude => [:login, :signup] before :has_role, :with => ["Admin"], :exclude => [:index,:show] before Proc.new {|c| c.some_method }, :only => :foo before :authorize, :unless => logged_in?
You can use either :only => :actionname or :exclude => [:this, :that] but not both at once. :only will only run before the listed actions and :exclude will run for every action that is not listed.
Merb‘s before filter chain is very flexible. To halt the filter chain you use throw :halt. If throw is called with only one argument of :halt the return of the method filters_halted will be what is rendered to the view. You can overide filters_halted in your own controllers to control what it outputs. But the throw construct is much more powerful then just that. throw :halt can also take a second argument. Here is what that second arg can be and the behavior each type can have:
throw :halt, "You don't have permissions to do that!" throw :halt, render(:action => :access_denied)
throw :halt, :must_click_disclaimer
If the second arg is a Proc, it will be called and its return value will be what is rendered to the browser:
throw :halt, proc {|c| c.access_denied } throw :halt, proc {|c| Tidy.new(c.index) }
:only<Symbol, Array[Symbol]>: | A list of actions that this filter should apply to |
:exclude<Symbol, Array[Symbol]: | A list of actions that this filter should not apply to |
:if<Symbol, Proc>: | Only apply the filter if the method named after the symbol or calling the proc evaluates to true |
:unless<Symbol, Proc>: | Only apply the filter if the method named after the symbol or calling the proc evaluates to false |
Filter: | <Array[Symbol, (Symbol, String, Proc)]> |