在rails >4.0.0生成器使用before_action而不是before_filter创建CRUD操作。它似乎做着同样的事情。这两者有什么区别呢?
当前回答
只是改了个名字而已。Before_action更具体,因为它在操作之前执行。
其他回答
Before_filter /before_action:表示在任何操作执行之前执行的任何操作。
两者都是一样的。它们只是彼此的别名,因为它们的行为是相同的。
为了弄清楚before_action和before_filter之间的区别,我们应该理解action和filter之间的区别。
动作是可以路由到的控制器的方法。 例如,你的用户创建页面可能被路由到userscontroller# new - new是这个路由中的动作。
过滤器在控制器动作之前、之后或前后运行。 这些方法可以通过重定向或为控制器中的每个动作设置公共数据来停止动作处理。
Rails 4 - > _action Rails 3 - > _filter
这只是语法上的不同,在rails应用中有CRUD和七个动作,基本上是通过名称索引,新建,创建,显示,更新,编辑,销毁。
Rails 4使它对开发人员非常友好,可以将语法在过滤前改为在操作前。
在我们声明的动作之前调用Before_action方法,例如
before_action :set_event, only: [:show, :update, :destroy, :edit]
Set_event是一个方法,它总是在显示、更新、编辑和销毁之前调用。
只是改了个名字而已。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
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未初始化 更好地节省时间,使用非弃用代码…
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 是否可以在MiniTest中运行单个测试?
- 如何在Ruby中生成a和b之间的随机数?
- ActiveRecord OR查询
- 无法安装gem -未能建立gem本地扩展-无法加载这样的文件——mkmf (LoadError)
- 如何在Ruby中创建文件
- 什么是Ruby文件。开放模式和选项?
- Ruby数组到字符串的转换
- 如何分割(块)一个Ruby数组成X元素的部分?
- Ruby中“or”和||的区别?
- 在Rails中使用user_id:integer vs user:references生成模型
- 如何测试参数是否存在在轨道
- 验证多个列的唯一性
- Rails:在where语句中使用大于/小于
- Rails:如何为Rails activerecord的模型中的属性创建默认值?