在rails >4.0.0生成器使用before_action而不是before_filter创建CRUD操作。它似乎做着同样的事情。这两者有什么区别呢?
before_action
before_filter
正如我们可以在ActionController::Base中看到一样,before_action只是before_filter的新语法。
ActionController::Base
然而,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之间的区别。
Rails 4 - > _action Rails 3 - > _filter
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
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