Rails 4:before_filter vs. before_action

时间:2013-05-13 10:26:27

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

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

7 个答案:

答案 0 :(得分:488)

尽可能ActionController::Base before_action before_filter before_filters只是{{1}}的{​​{3}}。

然而, Rails 5.0 中的所有{{1}}语法see将在 Rails 5.1中删除

答案 1 :(得分:63)

这只是语法差异,在rails app中有CRUD,七个动作基本上按名称索引创建,< strong>显示,更新修改销毁

Rails 4让开发人员友好,可以在过滤之前将语法更改为之前

我们声明的操作之前的

before_action 调用方法,如

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

set_event 是一种在显示,更新,编辑和销毁之前始终调用的方法。

答案 2 :(得分:30)

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

答案 3 :(得分:0)

要弄清楚before_action和before_filter之间的区别,我们应该理解action和filter之间的区别。

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

针对控制器操作运行的过滤器 - 在它们之前,之后或周围。 这些方法可以通过将公共数据重定向或设置为控制器中的每个操作来暂停操作处理。

  

Rails 4 - &gt; _action

     

Rails 3 - &gt; _filter

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

每当调用控制器中的任何方法时,都会调用

before_filter

调用路由配置文件中注册的控制器方法时,会调用

before_action

答案 6 :(得分:0)

仅将 before_action 与 rspec-rails 一起使用,水豚因为 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未初始化 更好地节省时间,使用非弃用代码...