ruby-on-rails – Rails 3:对默认值和关联模型中的validates_pr
我有一个基本的发票设置模型:Invoice,Item,LineItems.
# invoice.rb class Invoice < ActiveRecord::Base has_many :line_items,:dependent => :destroy validates_presence_of :status before_save :default_values def default_values self.status = 'sent' unless self.status end end # item.rb class Item < ActiveRecord::Base has_many :line_items validates_presence_of :name,:price end # line_item.rb class LineItem < ActiveRecord::Base belongs_to :item belongs_to :invoice before_save :default_values validates_presence_of :invoice_id validates :item_id,:presence => true end 模型中还有更多,但我只是为了简单起见而提出了上述内容. 我收到以下错误: 2 errors prohibited this invoice from being saved: Line items invoice can't be blank Status can't be blank 所以有两个问题: >如果我删除验证:invoice_id,:presence =>我没有得到行项目发票不能是空白的错误消息,但为什么?我想在line_items上验证invoice_id,所有line_items都应该有invoice_id.如何验证line_items上的invoice_id而不会出现错误? 解决方法
发生这两个验证错误都是因为在保存之前(以及在before_save回调之前)调用了验证.
我假设您正在使用nested_form来创建发票,同时它是行项目.如果是这种情况,您不想验证:invoice_id,:presence =>行项目为true – 发票和订单项同时进入,且发票尚未保存,因此没有ID.如果您保留验证,则需要先创建并保存空发票,然后再创建订单项,以便invoice_id可用.如果您只想确保在任何编辑后仍设置invoice_id,您可以通过验证强制执行此操作:invoice_id,:presence =>是的,:on => :更新此功能将在创建订单项时跳过验证(并且invoice_id尚不可用). 您遇到验证问题:status,:presence =>出于类似的原因,也是如此 – 通过请求进入的值正在被验证,并且“状态”值不存在. before_save回调在验证后运行.您可以在before_validation或after_initialization回调中设置默认值,并且在运行验证时值将存在. 有关更多信息,请查看Rails的Callbacks文档. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |