如何在 rails 5.2 上跳过 ruby 模型中的过滤器之前?
How to skip before filter in model with ruby on rails 5.2?
我的应用程序管理文档层次结构。每个文档都有一个层次索引,仅在创建时计算。文件 document.rb 以
开头
class BusinessRule < ActiveRecord::Base
### before filter
before_create :set_hierarchy
并且层次结构是根据父级和兄弟级计算的,因此self.hierarchy = last_one.next
在父级的范围内进行评估。
现在,我添加了版本管理功能。感谢添加到控制器的 new_version 方法,使用 @document.dup
方法复制文档,然后保存:层次结构应该保持不变,只需要版本号递增。
很好。
但是before_create过滤器是由模型中的save动作触发的,层次递增,不符合要求。
在控制器中执行 new_version 操作的情况下,如何防止触发模型中的前置过滤器?
我不确定这是否是最好的方法,但我会这样做。
class BusinessRule < ActiveRecord::Base
attr_accessor :skip_set_hierarchy
before_action :set_hierarchy, unless: :skip_set_hierarchy
...
end
现在,如果您不想触发回调,您可以按需将其设置为 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
ActiveRecord 将跳过回调,因为 skip_set_hierarchy 将 return 为真。您不需要更改其余代码,因为默认情况下它将 return nil
.
我认为这是使用 skip_callback 方法的好案例:
BusinessRule.skip_callback(:create, :before, :set_hierarchy)
# your code to create BusinessRule objects without setting hierarchy
# ...
BusinessRule.set_callback(:create, :before, :set_hierarchy)
如果您要经常 skip/set 回调,您可以使用特殊的帮助方法来简化它:
# config/initializers/without_callback.rb
module ActiveSupport::Callbacks::ClassMethods
def without_callback(*args, &block)
skip_callback(*args)
yield
set_callback(*args)
end
end
并且您将能够像这样跳过回调:
BusinessRule.without_callback(:create, :before, :set_hierarchy) do
# your code to create BusinessRule objects without setting hierarchy
# ...
end
我的应用程序管理文档层次结构。每个文档都有一个层次索引,仅在创建时计算。文件 document.rb 以
开头class BusinessRule < ActiveRecord::Base
### before filter
before_create :set_hierarchy
并且层次结构是根据父级和兄弟级计算的,因此self.hierarchy = last_one.next
在父级的范围内进行评估。
现在,我添加了版本管理功能。感谢添加到控制器的 new_version 方法,使用 @document.dup
方法复制文档,然后保存:层次结构应该保持不变,只需要版本号递增。
很好。 但是before_create过滤器是由模型中的save动作触发的,层次递增,不符合要求。
在控制器中执行 new_version 操作的情况下,如何防止触发模型中的前置过滤器?
我不确定这是否是最好的方法,但我会这样做。
class BusinessRule < ActiveRecord::Base
attr_accessor :skip_set_hierarchy
before_action :set_hierarchy, unless: :skip_set_hierarchy
...
end
现在,如果您不想触发回调,您可以按需将其设置为 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
ActiveRecord 将跳过回调,因为 skip_set_hierarchy 将 return 为真。您不需要更改其余代码,因为默认情况下它将 return nil
.
我认为这是使用 skip_callback 方法的好案例:
BusinessRule.skip_callback(:create, :before, :set_hierarchy)
# your code to create BusinessRule objects without setting hierarchy
# ...
BusinessRule.set_callback(:create, :before, :set_hierarchy)
如果您要经常 skip/set 回调,您可以使用特殊的帮助方法来简化它:
# config/initializers/without_callback.rb
module ActiveSupport::Callbacks::ClassMethods
def without_callback(*args, &block)
skip_callback(*args)
yield
set_callback(*args)
end
end
并且您将能够像这样跳过回调:
BusinessRule.without_callback(:create, :before, :set_hierarchy) do
# your code to create BusinessRule objects without setting hierarchy
# ...
end