Rails模型仅使用默认语言环境

时间:2016-11-07 10:48:54

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

  • 我有一个带有自定义验证的模型。我返回验证 使用AJAX将视图错误视为JSON。
  • 我需要显示错误 具有正确语言环境但消息的消息 显示每个区域设置的英语(默认)。
  • 当我返回I18n.locale时 它本身而不是消息(用于故障排除)它显示“en”,无论设置的语言环境是什么。
  • I18n在控制器或视图中按预期工作,这个问题 仅在模型中出现。
  • 我对区域设置的唯一配置是在应用程序配置中设置默认区域设置,并在应用程序控制器中的每个操作之前设置区域设置。
  • 我注意到的另一件事是,当我使用root_path而不提供语言环境时,它使用默认语言环境而不是保持当前语言环境。我认为这些问题是相关的

编辑:

  • 当我在控制器#create中打印locale参数时,我得到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

我忘记了什么吗?

我审核的信息:

3 个答案:

答案 0 :(得分:0)

控制器/视图中的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?

答案 1 :(得分:0)

如果在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

答案 2 :(得分:0)

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

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