【发布时间】:2023-03-26 14:24:01
【问题描述】:
对于特定模型的嵌套属性验证,我是新手,我发现它完全不可能解决。
我有一个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
我尝试在我的Address 模型中添加validates :postcode, presence: true,但这也是订单的要求,我不希望发生这种情况。
我还在我的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
任何人都可以对此有所了解吗?非常感谢!
【问题讨论】:
标签: ruby-on-rails validation nested-attributes