use*_*081 0 ruby-on-rails before-filter
我的应用程序管理文档的层次结构。每个文档都有一个层次结构索引,该索引仅在创建时计算。文件document.rb开始于
class BusinessRule < ActiveRecord::Base
### before filter
before_create :set_hierarchy
Run Code Online (Sandbox Code Playgroud)
并根据父级和兄弟级计算层次结构,以便在父级 self.hierarchy = last_one.next范围内进行评估。
现在,我添加了版本管理功能。由于在控制器中添加了new_version方法,因此使用该@document.dup方法可以复制文档,然后将其保存:层次结构应该保持不变,并且仅需要增加版本号。
精细。但是before_create过滤器是由模型中的save操作触发的,并且层次结构增加了,这不符合要求。
在控制器中执行new_version操作时,如何防止模型中的before过滤器触发?
我不确定这是否是最好的方法,但是我会做这样的事情。
class BusinessRule < ActiveRecord::Base
attr_accessor :skip_set_hierarchy
before_action :set_hierarchy, unless: :skip_set_hierarchy
...
end
Run Code Online (Sandbox Code Playgroud)
现在,如果您不希望触发回调,则可以根据需要将其设置为true:
def new_version
business_rule = BusinessRule.new business_rule_params
business_rule.skip_set_hierarchy = true
business_rule.save
#this can be refactored a lot (set the skip_set_hierarchy to true inside params, use create instead of new, I made it verbose on purpose to make it clearer)
end
Run Code Online (Sandbox Code Playgroud)
ActiveRecord将跳过回调,因为skip_set_hierarchy将返回true。您无需更改其余代码,因为默认情况下它将返回nil。
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |