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

Ruby on rails 仅使用默认语言环境的Rails模型 我有一个带有自定义验证的模型。我返回验证 使用AJAX将视图转换为JSON时出错 我需要显示错误 具有正确区域设置的消息,但消息 以英语(默认)显示每个区域设置。 当我返回I18n.locale时 无论设置的区域设置是什么,它都会显示“en”,而不是消息(用于故障排除) 控制器或视图中的I18n按预期工作,此问题 仅在模型中发生 我所做的关于区域设置的唯一配置是在应用程序配置中设置默认区域设置,并在应用程序控制器中的每个操作之前设置区域设置 我注意到的另一件事是,当我使用root_path而不提供区域设置时,它使用的是默认区域设置,而不是像应该的那样保留当前区域设置。我认为这些问题是相互关联的,ruby-on-rails,ruby,model-view-controller,model,internationalization,Ruby On Rails,Ruby,Model View Controller,Model,Internationalization,编辑: 当我在controller#create中打印locale参数时,得到nil。由于某种原因,我根本没有locale参数 模型文件: validate :relevant_date_time def relevant_date_time errors.add(:date_error, I18n.t("validations.date_error")) unless date_time_is_relevant? end 应用程序控制器: before_action :set_

编辑:

  • 当我在controller#create中打印locale参数时,得到nil。由于某种原因,我根本没有locale参数
模型文件:

validate :relevant_date_time

def relevant_date_time
    errors.add(:date_error, I18n.t("validations.date_error")) unless date_time_is_relevant?
end
应用程序控制器:

before_action :set_locale

def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end
# e.g. app/controllers/users_controller.rb
# user_params = { email: test@mail.com, password: 12345678 }
User.new(user_params.merge(locale: I18n.locale))
  def default_url_options(options={})
    { locale: I18n.locale }
  end
我忘了什么吗

我审查的资料:


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

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

before_action :set_locale

def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end
# e.g. app/controllers/users_controller.rb
# user_params = { email: test@mail.com, password: 12345678 }
User.new(user_params.merge(locale: I18n.locale))
  def default_url_options(options={})
    { locale: I18n.locale }
  end
然后,在验证方法中,您可以使用
locale
访问当前区域设置,因此您只需将其传递给
I18n.t

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

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

所以您也必须在模型内部设置区域设置。和你在控制器上做的一样

At控制器

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

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

before_action :set_locale

def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end
# e.g. app/controllers/users_controller.rb
# user_params = { email: test@mail.com, password: 12345678 }
User.new(user_params.merge(locale: I18n.locale))
  def default_url_options(options={})
    { locale: I18n.locale }
  end

现在就试过了,因为某些原因它仍然显示英语!它不起作用。仍然显示区域设置为en。由于某些原因,我的控制器中根本没有locale参数!你知道为什么会这样吗?