【问题标题】:Define attribute validation message across models跨模型定义属性验证消息
【发布时间】:2015-08-25 17:21:47
【问题描述】:

在我的 Rails 4 应用程序中,我检查一个唯一约束,如下所示:

validates :recipient, uniqueness: {
     scope: :user,
     message: 'You already have a Connection with this user'
}

现在,即使它涉及 recipient,我也想在 recipient.email 字段上显示错误消息。

是一种使用validates 语法的方法。

更新:这是在某种消息线程上,一个用户只能与另一个用户拥有一个。因此验证。

【问题讨论】:

  • 如果您的上述代码 sn-p 来自什么型号?
  • 这是一种消息线程,用户只能与另一个用户拥有一个。我确实更新了我的答案。
  • email是MessageThread的属性吗?作为表单的一部分如何处理电子邮件参数?
  • 你有RecipientModel吗?如果是这样,您会将电子邮件验证放在此类模型中。您当前的验证确保MessageThread 具有唯一的收件人。我建议发布模型本身——类声明、验证、关联。
  • 您可以使用自定义验证逻辑,validate :recipient_uniqueness 或其他东西,您将在其中执行 recipient.errors.add(:email, msg)

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


【解决方案1】:

不是一个干净的解决方案,但我相信它有效。但我不确定。

after_validation do
msg = 'You already have a Connection with this user'
   if errors.messages[:recipient] && errors.messages[:recipient].include? msg 
   errors.messages[:recipient].reject!{ |i| i == msg }
   errors.messages[:recipient][:email] = msg
end
end

【讨论】:

    【解决方案2】:

    一般来说,我的解决方案我已经可以正常工作,它会显示验证消息,但是我没有 recipient 的不同字段,而是包含 recipient 数据的子表单。

    就像 Arthur 指出的那样,我可能必须使用自定义验证器来执行此操作。我现在开始工作了:

    validate :unique_recipient
    
    def unique_recipient
      if user.threads.map(&:recipient).map(&:email).include?(recipient.email)
      recipient.errors.add(:email, "You already have a connection with #{recipient.first_name}")
      end
    end
    

    现在检查有点老套了,我喜欢原始解决方案的简单性,但这种方法的好处是我还可以在验证消息中显示用户 first_name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多