353

before_action在 rails >4.0.0 中,生成器使用not创建 CRUD 操作before_filter。它似乎做同样的事情。那么这两者有什么区别呢?

4

6 回答 6

538

正如我们在中看到ActionController::Basebefore_action只是.before_filter

但是该before_filter语法在Rails 5.0中已弃用,将在Rails 5.1中删除

于 2013-05-13T10:27:04.140 回答
72

这只是语法差异,在 Rails 应用程序中有 CRUD,并且基本上按名称indexnewcreateshowupdateeditdestroy七个动作。

Rails 4 让开发人员友好地将语法before filter更改为before action

before_action在我们声明的动作之前调用方法,比如

before_action :set_event, only: [:show, :update, :destroy, :edit]

set_event是一个总是在显示、更新、编辑和销毁之前调用的方法。

于 2014-05-06T12:59:09.410 回答
32

这只是一个名称更改。before_action更具体,因为它在动作之前执行。

于 2013-05-13T10:33:04.087 回答
1

before_filter/before_action:表示在任何操作执行之前要执行的任何操作。

两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。

于 2018-04-30T10:52:23.780 回答
0

仅将 before_action 与 rspec-rails 一起使用,capybara 作为 before_filter 会在测试过程中表现不正常,给人以惊喜

class TodosController < ApplicationController
  before_filter :authenticate

  def index
    @todos = Todo.all
  end
  ## Rest of the code follows
end

before_filter

feature 'User creates todo' do
  scenario 'successfully' do
    sign_in
    click_on 'Add Todo'
    fill_in 'Title', with: "Buy Milk"
    click_on 'Submit'

    expect(page).to have_css '.todos li', text: "Buy Milk"
  end
end

预期的失败是

NoMethodError:
       undefined method `authenticate' for #<TodosController:0x0000558b68573f48>

但是 before_filter 给出了...

ActionView::Template::Error:
       undefined method `each' for nil:NilClass

也就是说,钩子以某种方式运行而没有错误,但是控制器以未初始化的@todos 进行查看更好地节省时间,使用非弃用代码......

于 2021-06-13T12:39:17.560 回答
-4

要弄清楚before_action和before_filter有什么区别,我们应该了解action和filter的区别。

动作是您可以路由到的控制器的方法。例如,您的用户创建页面可能会路由到 UsersController#new - new 是此路由中的操作。

过滤器根据控制器动作运行——在它们之前、之后或周围。这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来停止操作处理。

Rails 4 –> _action

Rails 3 –> _filter

于 2017-04-06T05:51:41.937 回答