【问题标题】:Why use Proc.new to call a method in a Rails callback?为什么使用 Proc.new 在 Rails 回调中调用方法?
【发布时间】:2011-07-06 21:11:36
【问题描述】:

在 RoR 的所有教程中,我看到编码人员选择使用 Proc.new 的实例,而这似乎既不必要又没有吸引力。

例如,这里是一个放置在模型中的回调,一个使用 Proc.new 另一个大概做同样的事情:

class Order < ActiveRecord::Base  
  before_save :normalize_card_number,  
    :if => Proc.new { |order| order.paid_with_card? }  
end

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => "paid_with_card?"
end

那么有什么区别呢?为什么使用 Proc?他们不是都叫“paid_with_card”吗?方法?

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby proc-object


    【解决方案1】:

    在上面的例子中,对条件方法使用符号可能是最好的选择。

    class Order < ActiveRecord::Base
      before_save :normalize_card_number, :if => :paid_with_card?
    end
    

    字符串选项使用 eval 来评估字符串中的 Ruby 代码。所以就个人而言,如果调用方法,我更喜欢使用符号,如果编写短内联条件,我更喜欢使用 Proc。

    根据RailsGuides documentation

    使用 Proc 对象使您能够编写内联条件而不是单独的方法。此选项最适合单行。

    我认为以这种方式使用 Proc 可能会更好地说明:

    class Order < ActiveRecord::Base
      before_save :normalize_card_number,
        :if => Proc.new { |order| order.payment_type == "card" }
    end
    

    这可能会消除对paid_with_card 的需要吗?方法。

    【讨论】:

    • 是的,最好不要使用paid_with_card 之类的方法乱扔铁轨模型?
    • 我认为 :if 表明有一大堆配置选项会自动包含并从另一个上下文中重用。有一种默认方式来处理 :if => 字符串、proc 等来配置类似的选项,并且可能 :unless 也可以。
    【解决方案2】:

    我想说的是,在旧版本的 Rails 中,我们过去就是这样做的,有人添加了这样一个功能,您可以传递一个字符串以作为当前模型上的实例方法进行评估。

    在简单的场景中,它使旧样式变得多余,但允许将 Proc 用于更复杂的“if”语句,而仅在当前实例上使用方法是不可能实现的。

    【讨论】:

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