2016-11-24 57 views
0

我是关于特定模型的嵌套属性验证的新的,我发现它很难解决。只有一个特定模型的嵌套属性的Rails验证

我有一个Pharmacy model按如下:

class Pharmacy < ActiveRecord::Base 

    belongs_to :address 

    accepts_nested_attributes_for :address 

    validates :address, presence: true 

    validate :address_postcode_town 

    def address_postcode_town 
    errors.add(:'address.postcode', 'Postcode can't be blank') if address&.postcode.blank? 
    errors.add(:'address.town', "Town can't be blank") if address&.town.blank? 
    end 
end 

我也有一个Address model目前看起来是这样:

class Address < ActiveRecord::Base 

validates :first_line, presence: true 
end 

正如你所看到的,地址验证第一线的存在,和我需要在Pharmacy的邮政编码上添加验证,并且在我迷路的时候出现这部分内容。

我需要邮政编码的验证,这是Address属性,只为我的Pharmacy而不是我的Order

我尝试添加validates :postcode, presence: trueAddress模型,但随后它是订单的要求为好,我不想发生。

我也以我的Pharmacy模型尝试了before_validation,但如果这样的作品,作为视图不显示postcode can't be blank消息不知道:

before_validation :ensure_address_has_a_value 

def ensure_address_has_a_value 
    return false if address.blank? 
    !address.postcode.blank? || !address.city.blank? 
end 

我怎么能只在一个模型中添加验证嵌套属性,离开另一个,因为它们是?

我已经设法创建了一个可以工作的自定义验证,但是现在该视图不会将postcodetown识别为必需的属性,因此id不会显示错误消息。它只是再次呈现窗体。

params是在PharmacyController可用,我的观点看起来象下面这样:

**simple_form_for :pharmacy goes here** 
<%= f.simple_fields_for :address do |a|%> 
    <%= a.input :first_line, label: t('.first_line'), wrapper_html: {class: 'form-row'}%> 
    <%= a.input :second_line, label: t('.second_line'), wrapper_html: {class: 'form-row'}%> 
    <%= a.input :postcode, label: t('.postcode'), wrapper_html: {class: 'form-row'} %> 
    <%= a.input :town, label: t('.town'), wrapper_html: {class: 'form-row'} %> 

这并没有帮助我Validation for nested attributes

任何人都可以阐明这一些轻?提前谢谢了!!

回答

0

这是谷歌搜索的第一个结果,可能会帮助http://homeonrails.com/2012/10/validating-nested-associations-in-rails/

+0

谢谢,我已经试过了,但'reject_if',如果我没有错,靠的是在那里设置,而不是模型的值来自相关模型的值。如果他们满足条件,我需要接受这些属性,而不是他们需要接受的模型具有特定功能。 –

+0

我相信你可以做类似 'accepted_nested_attributes_for:address reject_if:proc {| attributes |属性[“邮政编码”。空白? }'药房'模型中的' 。 –

+0

我已经设法创建了一个可以工作的自定义验证,但是现在该视图不会将'postcode'和'town'识别为必需的属性,因此id不会显示错误消息。它只是再次呈现表格 –