Rails 2.3 自定义验证与循环检查存在

Posted

技术标签:

【中文标题】Rails 2.3 自定义验证与循环检查存在【英文标题】:Rails 2.3 custom validation with loop to check existance 【发布时间】:2012-02-01 13:55:53 【问题描述】:

我有一个名为 Booking 的模型,在创建时应该检查是否找到关联。 代码是:

  def price_details
    variant.tour.price_details.each do |pd|
      if category == pd.category
        if date_from >= pd.from_date && date_from <= pd.to_date
          return true
        else
          errors.add_to_base('error message')
          return false
        end
      end
    end
    nil
  end

Booking belongs_to variant 和一个 variant_id 保存在预订中。 date_from 也是 Booking 模型中的一个字段。

当我尝试运行验证时,我得到 NoMethodError: undefined method `tour' for nil:NilClass。

如何在创建之前访问变体?

编辑:

还是有这个问题,让我们在控制台试试吧。

b = Booking.new
b.valid?
=> NoMethodError: undefined method `tour' for nil:NilClass

variant.tour.price_details.each 做 |pd|是失败的那条线。 如果我这样做也会发生同样的情况

b = Booking.new(:variant_id => params[:variant_id])

【问题讨论】:

【参考方案1】:

为了从预订中获取变体的方法和属性,请确保您已将 variant_id 分配给新的预订实例,例如:booking = Booking.new(:variant_id =&gt; params[:variant_id])。然后您可以在预订时调用保存方法。我假设 variant_id 在您的控制器方法的参数哈希中可用。

【讨论】:

我正在尝试获取用户选择的 booking.variant。 Booking 属于一个变体。用户可以从表单中选择一个变体,它将作为变体 ID 保存在 Booking 表中。 我已经编辑了关于 belongs_to 的原始问题。 variant_id 是否已分配?尝试检查控制台中的 before_save 方法,看看 Booking.new(...).variant 是否真的不为零。 在尝试了您的建议后更新了我的问题。 您还会显示b = Booking.new(:variant_id =&gt; Variant.first.id); print b.variant 的控制台输出吗? params[:variant_id] 可能没有在控制台中定义,我仍然假设b.variant_id 在调用 before_save 助手之前没有定义。如果它仍然为零,我会仔细研究你的模型中的关联定义。【参考方案2】:

只是因为没有找到关联的记录,所以返回 NIL。 b = Booking.new(:variant_id =&gt; params[:variant_id]) 这里的variant_id 不在variants 表中

【讨论】:

以上是关于Rails 2.3 自定义验证与循环检查存在的主要内容,如果未能解决你的问题,请参考以下文章

使用列名和过滤器检查存在的自定义验证规则

rails 3 的验证自定义消息

使用 Rails 完全自定义验证错误消息

Rails:从自定义验证器调用标准验证

自定义摘要身份验证

ruby 用于检查rails_admin实现中的自定义操作的集成测试