Rails i18n为belongs_to验证翻译

时间:2014-07-13 11:19:19

标签: ruby-on-rails validation

我有一个像这样的用户模型 -

class User < ActveRecord::Base
  belongs_to :user_group

  validates :email, :user_group, presence: true
end

使用像这样的en.yml -

activerecord:
  errors:
    models:
      user:
        attributes:
          email:
            blank: Enter an email address.
          user_group:
            blank: Please choose a user group.

Rails可以使用电子邮件属性的状态验证错误消息,但同样不适用于 user_group 属性。为什么这样?

更新

我之前应该提到 - 我知道验证user_group_id而不是user_group的存在会以这种方式工作,但这并不是那么强大。

我的表格 -

<%= simple_form_for @user do |user_form| %>
    <%= user_form.association :user_group, collection: UserGroup.all, prompt: "Choose a User Group" %>
<% end %>

3 个答案:

答案 0 :(得分:2)

  

users表上的数据库列是user_group_id但是因为   belongs_to关联,user_group也是一个属性吗?

不,您应该在user_group_id属性上进行验证。user_group只是model name而不是attribute

将您的user modelen.yml更改为

#user.rb
class User < ActveRecord::Base
  belongs_to :user_group

  validates :email, :user_group_id, presence: true
end

#en.yml
activerecord:
  errors:
    models:
      user:
        attributes:
          email:
            blank: Enter an email address.
          user_group_id:
            blank: Please choose a user group

这应该有用。

答案 1 :(得分:2)

可以通过“ required”键来翻译对longate_to关系/关联的自动验证(在5.x中引入):

activerecord:
  errors:
    models:
      user:
        attributes:
          user_group:
            required: "Please choose a user group."

不需要进一步的显式验证(这将另外触发“空白”键)

答案 2 :(得分:1)

我通过Rails和i18n gem的源代码进行了调试,最后发现问题出现在我的en.yml文件中 -

activerecord:
  errors:
    models:
      user:
        attributes:
          email:
            blank: Enter an email address.
          user_group:
            blank: Please choose a user group.
          ......
          ......
          ......
          ......
          user_group:
            illegal_name: No special characters allowed

正如您所看到的,有两个user_group键(抱歉,我之前没有粘贴整个en.yml文件)。所以我将翻译改为

activerecord:
  errors:
    models:
      user:
        attributes:
          email:
            blank: Enter an email address.
          user_group:
            blank: Please choose a user group
            illegal_name: No special characters allowed

现在这个 -

class User < ActveRecord::Base
  belongs_to :user_group

  validates :email, :user_group, presence: true
end

显示翻译文件中给出的错误消息。