【问题标题】:Rails Callback: Use if more than once as conditional in a callbackRails 回调:在回调中多次使用 if 作为条件
【发布时间】:2014-10-21 15:13:54
【问题描述】:

我正在使用 Rails 3.2.19,在回调中使用多个 if 作为条件时遇到问题。

以下混合双重条件有效(评估 first_condtion 和 second_condition)

after_save :after_save_method, unless: :first_condition?, if: :second_condition?

但如果我使用两个if 条件,则每次都会执行 after_save_method。 (好像只取最后一个条件)

after_save :after_save_method, if: :first_condition?, if: :second_condition?

我还尝试将这两个条件与 '&&' 结合起来,但没有奏效。

after_save :after_save_method, if: :first_condition? && :second_condition?

为什么我不能多次使用if

apidoc 在http://edgeguides.rubyonrails.org/active_record_callbacks.html#multiple-conditions-for-callbacks 有一个带有除非和 if 的示例,但没有说明不允许两个“ifs”。

对此我的解决方案是将所有必要的代码提取到一个方法中,并且只评估该方法,但我只想确定 if 的东西。

【问题讨论】:

    标签: ruby-on-rails if-statement callback conditional


    【解决方案1】:

    我建议你创建一个知道你想要的逻辑的私有方法:

    after_save :after_save_method, if: :first_condition_and_second_condition?
    
    private
    
    def first_condition_and_second_condition?
      first_condition? && second_condition?
    end
    

    【讨论】:

      【解决方案2】:

      您可以为此目的使用 Proc。

      after_save :after_save_method, :if => Proc.new{ first_condition? && second_condition? }
      

      【讨论】:

      • 如果 first_condition? executes 为 true 回调总是被执行。
      【解决方案3】:

      正如@tristanm here 所说,您可以这样做:

      before_save do
        if first_condition? && second_condition?
          after_save_method
        end
      end
      

      这是@tristanm 建议的选项之一,如果您需要其他选项,请查看他的答案。

      【讨论】:

        【解决方案4】:

        值得一提的是,添加两个单独的 if: 条件不起作用,因为您作为参数传递给该方法的是 Ruby 选项哈希。第二个if: 覆盖第一个。

        【讨论】:

          猜你喜欢
          • 2011-11-28
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-02
          相关资源
          最近更新 更多