【问题标题】:Rails validation :if => Proc.new or lambda?Rails 验证:if => Proc.new 还是 lambda?
【发布时间】:2011-06-03 20:07:34
【问题描述】:

我发现,在我看到的所有示例(包括 rails 文档)中,验证方法的 :if 选项都使用 Proc.new 而不是 lambda,例如

class Foo < ActiveRecord::Base
  validates_presence_of :name, :if => Proc.new{|f| .... } # why not lambda here?
end

这有什么原因吗? 据我所知,lambda

  1. 对参数更严格。
  2. lambda 块中的 return 语句也从块中返回,而不是从调用函数中返回。

对于 :if 上面提到的选项来说,两者似乎都是可取的行为,我有什么遗漏吗?

【问题讨论】:

    标签: ruby-on-rails lambda


    【解决方案1】:

    对于 :if 上面提到的选项来说,两者似乎都是可取的行为,我有什么遗漏吗?

    我猜:

    允许 Procs 更可取,因为它们不关心参数的数量。所以我可以很容易地写出以下任何内容:

    validates_presence_of :name, :if => Proc.new{|f| f.display_name.blank? }    # I care about 'f' here as I need it to check something.
    

    ...和:

    validates_presence_of :secret_sauce, :if => Proc.new{ MyApp::REQUIRE_SECRET_SAUCE }    # I don't care about any arguments being passed in.
    

    这似乎是一件小事,但我想它增加了灵活性。

    【讨论】:

    • 谢谢Jits,我认为在没有模型实例的情况下使用 :if 选项是非常罕见的,在这种情况下我仍然可以放置 |dummy|那里。所以我会选择 lambda,但你的解释是有道理的。
    • 但是我们真的需要将实例作为参数传递吗?如果我理解正确,块中的代码(在 Proc.new 或 lambda 中)将在需要时进行评估,并且可以编写如下内容: has_many :associated_objects before_save :do_something, if: -> { associated_objects.empty? } 注意我跳过了参数 { |instance| instance.associated_... }
    猜你喜欢
    • 2011-10-25
    • 2019-08-06
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多