【发布时间】:2013-05-07 08:32:11
【问题描述】:
在 Rails >4.0.0 中,生成器使用 before_action 而不是 before_filter 创建 CRUD 操作。它似乎做同样的事情。那么这两者有什么区别呢?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 crud
在 Rails >4.0.0 中,生成器使用 before_action 而不是 before_filter 创建 CRUD 操作。它似乎做同样的事情。那么这两者有什么区别呢?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 crud
仅在 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
也就是说,钩子以某种方式运行而没有错误,但是控制器以未初始化的@todos 进行查看 更好地节省时间,使用非弃用代码...
【讨论】:
正如我们在ActionController::Base 中的see 一样,before_action 只是new syntax 的before_filter。
但是,Rails 5.0 中的 before_filter 语法 is deprecated 将在 Rails 5.1
【讨论】:
before_filter/before_action:表示在任何动作执行之前要执行的任何事情。
两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。
【讨论】:
要弄清楚before_action和before_filter有什么区别,我们应该了解action和filter的区别。
动作是您可以路由到的控制器的方法。 例如,您的用户创建页面可能会路由到 UsersController#new - new 是此路由中的操作。
过滤器根据控制器操作运行 - 在它们之前、之后或周围。 这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来停止操作处理。
Rails 4 –> _action
Rails 3 –> _filter
【讨论】:
这只是一个名称更改。 before_action 更具体,因为它在操作之前执行。
【讨论】:
只是语法不同,在rails应用程序中有CRUD,七个动作基本上按名称index、new、create、显示、更新、编辑、销毁。
Rails 4 让开发人员友好地将语法 before filter 更改为 before action。
before_action在我们声明的动作之前调用方法,比如
before_action :set_event, only: [:show, :update, :destroy, :edit]
set_event 是一个总是在显示、更新、编辑和销毁之前调用的方法。
【讨论】: