编辑:
模型文件:
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
我忘记了什么吗?
我审核的信息:
答案 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