我正在阅读pag中的“使用Rails 4进行敏捷Web开发”。 338它说:
[...]回调可以是被动的,监控由控制器执行的活动。他们还可以更积极地参与请求处理。如果before action回调返回false,则回调链的处理将终止,并且不会运行该操作。 [...]
现在我怀疑如下:这里how to execute an action if the before_action returns false有人告诉我们,before_action的目标是在执行动作之前准备一些东西,如果它返回false则不表示动作没有运行,但根据这本书,它是正确的......所以我有点困惑。
如果我正在尝试以下
class ProductsController < ApplicationController
before_action :test
def index
@products = Product.all
end
private
def test
return false
end
end
但操作已执行,当我致电/products
时,我没有收到任何错误,页面显示正常
答案 0 :(得分:49)
before_action
(以前称为before_filter
)是在执行操作之前执行的回调。您可以阅读有关controller before/after_action的更多信息。
通常用于准备动作或改变执行。
约定是,如果链中的任何方法呈现或重定向,则暂停执行并且不呈现操作。
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
在此示例中,如果current_user.admin?
返回false,则永远不会执行hello
操作。
以下是动作设置的一个示例:
before_action :find_post
def show
# ...
end
def edit
# ...
end
def update
# ...
end
protected
def find_post
@post = Post.find(params[:id])
end
在这种情况下,find_post
永远不会返回false。实际上,此before_action的目的是从操作主体中提取共享命令。
关于返回false
,据我所知,这对于ActiveRecord回调是正确的。但对于before_action,返回false不起作用。实际上,官方文档中没有提到返回值。