【问题标题】:Rails validation for nested attributes in just one especific model仅在一个特定模型中对嵌套属性进行 Rails 验证
【发布时间】: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

如何仅在一个模型中为嵌套属性添加验证,而使另一个保持原样?

我设法创建了一个有效的自定义验证,但现在视图无法将 postcodetown 识别为必需属性,因此 id 不会显示错误消息。它只是再次呈现表单。

paramsPharmacyController 中可用,我的视图如下所示:

**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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我已经尝试过了,但是 reject_if,如果我没记错的话,它依赖于设置它的模型的值,而不是来自关联模型的值。如果属性满足条件,而不是需要接受它们的模型具有特定特征,我需要接受这些属性。
    • 我相信你可以在你的Pharmacy 模型中做类似accepts_nested_attributes_for :address reject_if: proc { |attributes| attributes['zipcode'].blank? } 的事情。
    • 我设法创建了一个有效的自定义验证,但现在视图无法将 postcodetown 识别为必需属性,因此 id 不显示错误消息。它只是再次呈现表单
    • 根据这里的简单表单使用文档github.com/plataformatec/simple_form#usage ``` 默认情况下所有输入都是必需的。当表单对象包含 ActiveModel::Validations(例如,在 Active Record 模型中发生)时,只有在存在验证时才需要字段。否则,简单表单会将字段标记为可选。 ```
    • 这让我更近了一步,我已将required: true 添加到我的字段中,所以现在它们在页面中显示为这样,添加了&lt;%= f.full_error :town, wrapper_html: {class: 'error'} %&gt; 并且错误可见!现在我只需要修复由于某种原因未显示的 css....谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多