【问题标题】:Rails 4 - Remove attribute name from error message for associated model presenceRails 4 - 从关联模型存在的错误消息中删除属性名称
【发布时间】:2016-02-27 18:27:46
【问题描述】:

我有两个型号user_itemuser_item_images

user_item.rb

has_many :user_item_images, dependent: :destroy
validates :user_item_images, presence: { message: "You must include a picture" }

user_item_images.rb

belongs_to :user_item

我有一个嵌套表单,其中只有一个 user_item_image 字段,即 :picture。当我提交一个空表单时,我会收到此消息

用户项目图片您必须包含图片

如何让消息改为显示

您必须包含图片

我不知道如何编辑 en.yml 文件,因为错误在于存在另一个模型而不是模型的属性。

我查看了here,但答案过于宽泛,我认为我需要自定义验证。

【问题讨论】:

标签: ruby-on-rails validation activerecord rails-i18n


【解决方案1】:

改为创建自定义验证:

has_many :user_item_images, dependent: :destroy
validate :has_a_picture

private

def has_a_picture
  errors.add(:base, 'You must include a picture') if user_item_images.none?
end 

【讨论】:

  • 我为什么还要包含presence: ...
  • 我实际上尝试过使用您的monkey patch。它适用于 user_item_images 上的图片属性不适用于关联的存在。
  • 我收到此错误消息"undefined method 'none?' for :user_item_images:Symbol",因此我将方法更改为... if self.user_item_images.none?。我唯一的问题是我需要确定除非有关联的user_item_image,否则永远无法创建user_item。此验证会完成此操作吗?
  • 我注意到您的编辑。 self.user_item_images.none? 中的 self 会是多余的吗?
  • @user4584963 - 它应该在应用程序级别防止这种情况发生,但是您需要为其他情况做好准备,例如用户使用图像创建项目然后删除图像。最好有某种 db 约束以 100% 确定。
【解决方案2】:

无需编写额外代码。您应该使用 Rails 内置的 I18n 来自定义 ActiveRecord 错误消息。

内部config/locales/en.yml

en:
  activerecord:
    errors:
      models:
        user_item:
          attributes:
            user_item_images:
              presence: "You must include a picture"

【讨论】:

  • 您的建议无效。通过此更改,我仍然收到相同的错误消息,但属性名称仍然存在。
  • 您可能还需要在 user_item_images 中添加格式:'%{message}':
【解决方案3】:

为此,在您的 user_item_images 模型中,您需要: validates :picture, presence: true 您可能还想查看是否有需要解决的数据建模问题。无论如何,您当前的验证仅验证关联是否存在。因此,当您提交带有空图片字段的 user_item_images 表单时,失败的验证是您的 user_item 模型中的验证。与其尝试更改关联存在验证错误消息的内容,不如在 user_item_images 中为图片列添加验证。这样,如果图片为空,它将引发“您必须包含图片”。

我还要评论说,在 user_item 模型上进行存在验证 :user_item_images 不是必需的,并且可能表明您需要解决更大的数据建模问题。

【讨论】:

  • 我想你可能对我的模型是如何设置感到困惑。 user_item 不应该存在,除非有关联的user_item_image。我收到消息"You must include a picture" 的原因是因为这是用户能够添加到user_item_image 的唯一属性。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多