在rails> 4.0.0中,生成器使用before_action
而非before_filter
创建CRUD操作。它似乎做同样的事情。那么这两者之间的区别是什么?
答案 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未初始化 更好地节省时间,使用非弃用代码...