【问题标题】:How to skip before filter in model with ruby on rails 5.2?如何在使用 ruby​​ on rails 5.2 过滤模型之前跳过?
【发布时间】:2018-10-31 22:11:30
【问题描述】:

我的应用程序管理文档的层次结构。每个文档都有一个层次索引,该索引仅在创建时计算。文件 document.rb 以

开头
class BusinessRule < ActiveRecord::Base
### before filter
  before_create :set_hierarchy

并且层次结构是根据父级和兄弟级计算的,因此self.hierarchy = last_one.next在父级范围内进行评估。

现在,我添加了版本管理功能。由于添加到控制器中的 new_version 方法,使用@document.dup 方法复制文档,然后将其保存:层次结构应该保持不变,只需要增加版本号。

很好。 但是模型中的save动作触发了before_create过滤器,层级递增,不符合要求。

如何防止模型中的 before 过滤器在控制器中 new_version 动作的情况下触发?

【问题讨论】:

    标签: ruby-on-rails before-filter


    【解决方案1】:

    我不确定这是否是最好的方法,但我会这样做。

    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 将返回 true。您无需更改其余代码,因为默认情况下它将返回 nil

    【讨论】:

      【解决方案2】:

      我认为这是使用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)
      

      如果你要经常跳过/设置回调,你可以使用特殊的帮助方法来简化它:

      # 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2015-04-09
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多