Rails 4: before_filter vs. before_action

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

172941 次浏览

正如我们可以在ActionController::Base看到一样,before_action只是before_filter新语法

然而,before_filter语法被弃用Rails 5.0和将被删除在Rails 5.1

只是改了个名字而已。before_action更具体,因为它在操作之前执行。

这只是语法差异,在rails应用程序中有CRUD,和七个动作基本上是通过名称指数创建显示更新编辑摧毁

Rails 4使得将语法在过滤器更改为在行动之前对开发人员非常友好。

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

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

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

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

动作是你可以路由到的控制器的一个方法。 例如,你的用户创建页面可能被路由到userscontroller# new - new是这个路由中的动作 过滤器在控制器动作之前、之后或前后运行。 这些方法可以通过重定向或设置公共数据到控制器中的每个动作来停止动作处理

Rails 4 - > _action

Rails 3 - > _filter

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

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

在rspec-rails中只使用before_action,因为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未初始化 更好地节省时间,使用非弃用代码