【问题标题】:Rails model using only default localeRails 模型仅使用默认语言环境
【发布时间】:2017-03-20 16:30:11
【问题描述】:
  • 我有一个带有自定义验证的模型。我返回验证 使用 AJAX 以 JSON 格式显示错误。
  • 我需要显示错误 具有正确语言环境的消息,但消息 以英语(默认)显示每个语言环境。
  • 当我返回 I18n.locale 它本身而不是消息(用于故障排除),无论设置的语言环境是什么,它都会显示“en”。
  • 控制器或视图中的 I18n 按预期工作,这个问题 仅在模型中出现。
  • 我对语言环境所做的唯一配置是在应用程序配置中设置默认语言环境,并在应用程序控制器中的每个操作之前设置语言环境。
  • 我注意到的另一件事是,当我在不提供语言环境的情况下使用 root_path 时,它使用的是默认语言环境,而不是保持当前语言环境应有的状态。我认为这些问题是相关的

编辑:

  • 当我在控制器#create 中打印语言环境参数时,我得到了 nil。出于某种原因我根本没有语言环境参数

模型文件:

validate :relevant_date_time

def relevant_date_time
    errors.add(:date_error, I18n.t("validations.date_error")) unless date_time_is_relevant?
end

application_controller:

before_action :set_locale

def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end

我是不是忘记了什么?

我查看的信息:

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller model internationalization


    【解决方案1】:

    如果您在 application_controller.rb 中设置区域设置,它将仅在所有控制器和视图中具有作用域,而不在模型中。

    所以你也必须在模型中设置语言环境。和你在控制器上做的一样。

    在控制器处

    Model.new(params.merge(locale: I18n.locale))
    

    内部模型

    attr_accessible :locale      
    
    before_validation() do
      I18n.local = locale
    end
    
    def relevant_date_time
      errors.add(:date_error, I18n.t("validations.date_error")) unless date_time_is_relevant?
    end
    

    【讨论】:

    • 它没有用。仍然显示语言环境是 en。出于某种原因,我的控制器中根本没有 locale 参数!你知道为什么会发生这种情况吗?
    【解决方案2】:

    控制器/视图中的 I18n 区域设置仅适用于操作的上下文,它不会更改您的应用程序的默认区域设置,这是您的模型从中获取其区域设置的位置(正如您所发现的那样)。

    您缺少的步骤是将区域设置从您的操作传递到您的模型中,您可以通过在模型中添加 attr_accessor :locale 来实现,然后在控制器中创建/更新时传递区域设置:

    # e.g. app/controllers/users_controller.rb
    # user_params = { email: test@mail.com, password: 12345678 }
    User.new(user_params.merge(locale: I18n.locale))
    

    然后在您的验证方法中,您将能够使用locale 访问当前语言环境,因此您只需将其传递给I18n.t

    errors.add(:date_error, I18n.t("validations.date_error", locale: locale)) unless date_time_is_relevant?
    

    【讨论】:

    • 现在试了一下,不知为何还是显示英文!
    【解决方案3】:

    通过在应用控制器中添加如下方法解决:

      def default_url_options(options={})
        { locale: I18n.locale }
      end
    

    【讨论】:

      【解决方案4】:

      对于在模型验证中遇到 I18n 问题的任何人,解决方案可能不在模型中包含任何自定义消息键,而是

      en:
        activerecord:
          errors:
            models:
              model_name:
                attributes:
                  attr_name:
                    taken: << or whatever error message like blank, too_long, too_short etc.
      

      信用: https://stackoverflow.com/a/4453350/267693

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-17
        • 2011-10-29
        • 2016-09-07
        • 2014-03-31
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多