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

zer*_*uno 27 ruby-on-rails ruby-on-rails-4

我正在阅读pag中的"使用Rails 4进行敏捷Web开发".338它说:

[...]回调可以是被动的,监控由控制器执行的活动.他们还可以更积极地参与请求处理.如果before action回调返回false,则回调链的处理将终止,并且不会运行该操作.[...]

现在我的疑问如下:这里如果执行一个动作,如果before_action返回false,则告诉before_action的目标是在执行动作之前准备一些东西,如果它返回false则不表示动作是没有跑,但根据书,它是正确的...所以我有点困惑.

如果我正在尝试以下内容

class ProductsController < ApplicationController
before_action :test

  def index
    @products = Product.all
  end


  private

    def test
      return false
    end
end
Run Code Online (Sandbox Code Playgroud)

但是执行动作,当我打电话时/products我没有收到任何错误,页面显示就好了

Sim*_*tti 49

before_action(以前命名before_filter)是在执行操作之前执行的回调.您可以在/ 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
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果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
Run Code Online (Sandbox Code Playgroud)

在这种情况下find_post永远不会返回false.实际上,此before_action的目的是从操作主体中提取共享命令.

关于返回false,据我所知,这对于ActiveRecord回调是正确的.但对于before_action,返回false不起作用.实际上,官方文档中没有提到返回值.

  • 这本书(如报道的那样)是错误的.停止动作的是处理程序中的渲染,例如`redirect`或`head`.引擎检测到网络命中满足,并停止游行. (11认同)
  • 这个答案现在应该更新。与最新的 Rails 版本一样,仅对 ActiveRecord 回调返回 false 不会中断执行。您需要明确地“ throw(:abort)”。 (2认同)