我是关于特定模型的嵌套属性验证的新的,我发现它很难解决。只有一个特定模型的嵌套属性的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: true
我Address
模型,但随后它是订单的要求为好,我不想发生。
我也以我的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
我怎么能只在一个模型中添加验证嵌套属性,离开另一个,因为它们是?
我已经设法创建了一个可以工作的自定义验证,但是现在该视图不会将postcode
和town
识别为必需的属性,因此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
任何人都可以阐明这一些轻?提前谢谢了!!
谢谢,我已经试过了,但'reject_if',如果我没有错,靠的是在那里设置,而不是模型的值来自相关模型的值。如果他们满足条件,我需要接受这些属性,而不是他们需要接受的模型具有特定功能。 –
我相信你可以做类似 'accepted_nested_attributes_for:address reject_if:proc {| attributes |属性[“邮政编码”。空白? }'药房'模型中的' 。 –
我已经设法创建了一个可以工作的自定义验证,但是现在该视图不会将'postcode'和'town'识别为必需的属性,因此id不会显示错误消息。它只是再次呈现表格 –