2
  • У меня есть модель с пользовательскими проверками. Я возвращаю подтверждение ошибок в представлении как JSON с использованием AJAX.
  • Мне нужно показать сообщение об ошибке с правильной локалью, но сообщения показать по-английски (по умолчанию) для каждого языкового стандарта.
  • Когда я возвращаю I18n.locale сам, а не сообщение (для устранения неполадок), он показывает «ru», независимо от того, что является установленным языковым стандартом.
  • I18n в контроллерах или представлениях работает как ожидалось, эта проблема возникает только в модели.
  • Единственная конфигурация, которую я сделал относительно локали, устанавливает языковой стандарт по умолчанию в конфигурации приложения и устанавливает локаль перед каждым действием в контроллере приложения.
  • Еще одна вещь, которую я заметил, заключается в том, что, когда я использую root_path без предоставления языкового стандарта, он использует стандартную локаль, вместо этого сохраняя текущую локальу, как должен. Я думаю, что эти вопросы связаны

Edit:Модель Rails, использующая только стандартную локаль

  • При печати параметр локали в контроллере # создать, я получаю ноль. По какой-то причине У меня нет параметра locale вообще.

модель файла:

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 

Am Я забыл?

Информация Просмотрев:

ответ

0

решена путем добавления следующего метода в контроллере Применение:

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

Язык I18n в контроллерах/представлениях применяется только к контексту действия, он не изменяет настройку локали вашего приложения по умолчанию, из которой ваша модель получает свою локаль (как вы обнаружили).

Стадия вам не хватает, чтобы передать локаль в модель от ваших действий, которые вы могли бы сделать, добавив attr_accessor :locale к вашей модели, а затем передать локаль через при создании/обновлении его в контроллере:

# e.g. app/controllers/users_controller.rb 
# user_params = { email: [email protected], 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? 
+0

Пытались, что сейчас, по какой-то причине он все еще показывает E сский! – MaxDBN

0

Если установить локаль в application_contro ller.rb, он будет иметь область видимости во всех контроллерах и представлениях NOT в моделях.

Таким образом, вы также должны установить локаль внутри модели. То же, что и у диспетчера.

В контроллере

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 
+0

Это не сработало. Все еще показывает, что локаль en. По какой-то причине у меня нет параметра locale в моем контроллере вообще! Вы знаете, почему это может произойти? – MaxDBN

Смежные вопросы