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 => params[:variant_id])
。然后您可以在预订时调用保存方法。我假设 variant_id
在您的控制器方法的参数哈希中可用。
【讨论】:
我正在尝试获取用户选择的 booking.variant。 Booking 属于一个变体。用户可以从表单中选择一个变体,它将作为变体 ID 保存在 Booking 表中。 我已经编辑了关于 belongs_to 的原始问题。 variant_id 是否已分配?尝试检查控制台中的 before_save 方法,看看Booking.new(...).variant
是否真的不为零。
在尝试了您的建议后更新了我的问题。
您还会显示b = Booking.new(:variant_id => Variant.first.id); print b.variant
的控制台输出吗? params[:variant_id] 可能没有在控制台中定义,我仍然假设b.variant_id
在调用 before_save 助手之前没有定义。如果它仍然为零,我会仔细研究你的模型中的关联定义。【参考方案2】:
只是因为没有找到关联的记录,所以返回 NIL。
b = Booking.new(:variant_id => params[:variant_id])
这里的variant_id 不在variants
表中
【讨论】:
以上是关于Rails 2.3 自定义验证与循环检查存在的主要内容,如果未能解决你的问题,请参考以下文章