在Rails 4中,before_action返回false是什么意思?

时间:2013-12-17 00:17:45

标签: ruby-on-rails ruby-on-rails-4

我正在阅读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时,我没有收到任何错误,页面显示正常

1 个答案:

答案 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不起作用。实际上,官方文档中没有提到返回值。