I am reading the "Agile Web Development with Rails 4", on pag. 338 it says:
[...] Callbacks can be passive, monitoring activity performed by a controller. They can also take a more active part in request handling. If a before action callback returns false, then processing of the callback chain terminates, and the action is not run. [...]
Now my doubt is the following: here how to execute an action if the before_action returns false it was told that the goal of the before_action is to prepare something before the action is executed, if it returns false it doesn't mean that the action is not run, but according the book it is right so...so I am getting a little bit confused.
If I'm trying the following
class ProductsController < ApplicationController
before_action :test
def index
@products = Product.all
end
private
def test
return false
end
end
But the action is executed, when I call /products
I do not get any error and the page shows up just fine
When writing controllers in Ruby on rails, using before_action (used to be called before_filter in earlier versions) is your bread-and-butter for structuring your business logic in a useful way. It's what you want to use to "prepare" the data necessary before the action executes.
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.
Rails provides before and after actions in controllers as an easy way to call methods before or after executing controller actions as response to route requests.
before_action
(formerly named before_filter
) is a callback that is performed before an action is executed. You can read more about controller before/after_action.
It is normally used to prepare the action or alter the execution.
The convention is that if any of the methods in the chain render or redirect, then the execution is halted and the action is not rendered.
before_action :check_permission def hello end protected def check_permission unless current_user.admin? # head is equivalent to a rendering head(403) end end
In this example, if current_user.admin?
returns false, the hello
action is never performed.
The following one, instead, is an example of action setup:
before_action :find_post def show # ... end def edit # ... end def update # ... end protected def find_post @post = Post.find(params[:id]) end
In this case find_post
will never return false. In fact, the purpose of this before_action is to extract a shared command from the body of the actions.
About returning false
, as far as I know this is true for ActiveRecord callbacks. But for a before_action, returning false has no effect. In fact, the return value is not mentioned as important in the official documentation.
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