【问题标题】:Rails: Form Object not finding I18n on activemodel (namespacing issue)Rails:表单对象在 activemodel 上找不到 I18n(命名空间问题)
【发布时间】:2017-07-09 05:05:43
【问题描述】:

我有一个表单对象(rails 3),我正在尝试使用config/locales/en.yml 来获取错误消息。

我的表单对象如下所示:

class Users::PasswordAndLoginUpdatingForm
  include Virtus.model

  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations

  attribute :requested_email_address, String
  validates :requested_email_address, allow_blank: true, format: { with: User::VALID_EMAIL_REGEX }

在我的形式中,我有通常的

form_for @form_object ... do |f|

如果我pry 并找出f.object_name 是什么,我会得到users_password_and_login_updating_form

最后,我的config/locales/en.yml 看起来像这样:

en:
  activemodel:
    errors:
      models:
        users_password_and_login_updating_form:
          attributes:
            requested_email_address:
              invalid: "bar"

我遇到的问题是,我无法让它使用国际化。

【问题讨论】:

    标签: ruby-on-rails forms rails-i18n


    【解决方案1】:

    好吧,我通过深入研究源代码找到了答案。我遇到的问题是我的form object 位于Users::PasswordAndLoginUpdatingForm 命名空间中。

    技巧使用activemodel:作为命名空间,但是,如果你的模型中有更多命名空间,它们将用/s分隔。

    所以,正确的 yml 如下所示:

    en:
      activemodel:
        errors:
          models:
            users/password_and_login_updating_form:
              attributes:
                requested_email_address:
                  invalid: "foo"
    

    【讨论】:

      【解决方案2】:

      在您的config/locales/en.yml 文件中应该是activerecord: 而不是activemodel:

      【讨论】:

      • 不,我不这么认为,因为这个表单继承自 ActiveRecord。我只是尝试了一下,但没有运气。
      • 两个建议:首先,如果你还没有,看看这个 - api.rubyonrails.org/classes/ActiveModel/Errors.html - 特别是第一个代码块和它下面的文本,上面写着“最后三个方法是必需的在您的对象中,以便 Errors 能够正确生成错误消息并处理多种语言。”它是 Rails 5。其次,看看这个 - stackoverflow.com/questions/17935597/… - 看看你是否可以让它作为自定义验证错误消息工作。
      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2023-03-11
      相关资源
      最近更新 更多