加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 3:对默认值和关联模型中的validates_pr

发布时间:2020-12-17 02:36:29 所属栏目:百科 来源:网络整理
导读:我有一个基本的发票设置模型:Invoice,Item,LineItems. # invoice.rbclass Invoice ActiveRecord::Base has_many :line_items,:dependent = :destroy validates_presence_of :status before_save :default_values def default_values self.status = 'sent' u
我有一个基本的发票设置模型: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而不会出现错误?
>如果我将其设置为默认值,为什么我得到状态不能为空?我可以在invoices_controller上设置它,但我认为应该在模型中设置默认值,对吧?如何验证状态的存在并且在模型中仍然具有默认值?

解决方法

发生这两个验证错误都是因为在保存之前(以及在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文档.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读