before_action
在 rails >4.0.0 中,生成器使用not创建 CRUD 操作before_filter
。它似乎做同样的事情。那么这两者有什么区别呢?
6 回答
这只是语法差异,在 Rails 应用程序中有 CRUD,并且基本上按名称index、new、create、show、update、edit、destroy七个动作。
Rails 4 让开发人员友好地将语法before filter更改为before action。
before_action在我们声明的动作之前调用方法,比如
before_action :set_event, only: [:show, :update, :destroy, :edit]
set_event是一个总是在显示、更新、编辑和销毁之前调用的方法。
这只是一个名称更改。before_action
更具体,因为它在动作之前执行。
before_filter/before_action:表示在任何操作执行之前要执行的任何操作。
两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。
仅将 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 进行查看更好地节省时间,使用非弃用代码......
要弄清楚before_action和before_filter有什么区别,我们应该了解action和filter的区别。
动作是您可以路由到的控制器的方法。例如,您的用户创建页面可能会路由到 UsersController#new - new 是此路由中的操作。
过滤器根据控制器动作运行——在它们之前、之后或周围。这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来停止操作处理。
Rails 4 –> _action
Rails 3 –> _filter