Rails 4:before_filter 与 before_action
Posted
技术标签:
【中文标题】Rails 4:before_filter 与 before_action【英文标题】:Rails 4: before_filter vs. before_action 【发布时间】:2013-05-07 08:32:11 【问题描述】:在 Rails >4.0.0 中,生成器使用 before_action
而不是 before_filter
创建 CRUD 操作。它似乎做同样的事情。那么这两者有什么区别呢?
【问题讨论】:
【参考方案1】:仅在 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 进行查看 更好地节省时间,使用非弃用代码...
【讨论】:
【参考方案2】:正如我们在ActionController::Base
中的see 一样,before_action
只是new syntax 的before_filter
。
但是,Rails 5.0 中的 before_filter
语法 is deprecated 将在 Rails 5.1
【讨论】:
一方面弃用是有道理的,但另一方面在 Rails 和 ruby 中有一个很好的做法,可以为一种方法设置多个别名,这样您就可以在不同的上下文中使用它而不会失去意义。 在 4.2 中,他们并没有弃用它,而是将其从文档中删除,因为不鼓励这样做。 edgeguides.rubyonrails.org/… 如果不鼓励,那么为什么不会弃用它?傻。 @JohnWhitley - 弃用不会破坏 API。这就是弃用的全部意义所在。 @JohnWhitley - 垃圾邮件是有原因的。任何纪律严明的项目都应通过不使用已弃用的函数来解决弃用警告。【参考方案3】:before_filter/before_action:表示在任何动作执行之前要执行的任何事情。
两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。
【讨论】:
【参考方案4】:要弄清楚before_action和before_filter有什么区别,我们应该了解action和filter的区别。
动作是您可以路由到的控制器的方法。 例如,您的用户创建页面可能会路由到 UsersController#new - new 是此路由中的操作。
过滤器根据控制器操作运行 - 在它们之前、之后或周围。 这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来停止操作处理。
Rails 4 –> _action
Rails 3 –> _filter
【讨论】:
【参考方案5】:这只是一个名称更改。 before_action
更具体,因为它在操作之前执行。
【讨论】:
【参考方案6】:只是语法不同,在rails应用程序中有CRUD,七个动作基本上按名称index、new、create、显示、更新、编辑、销毁。
Rails 4 让开发人员友好地将语法 before filter 更改为 before action。
before_action在我们声明的动作之前调用方法,比如
before_action :set_event, only: [:show, :update, :destroy, :edit]
set_event 是一个总是在显示、更新、编辑和销毁之前调用的方法。
【讨论】:
以上是关于Rails 4:before_filter 与 before_action的主要内容,如果未能解决你的问题,请参考以下文章
升级到 Rails 4.2.5.1 后 nil:NilClass 的未定义方法“缓存”