Rails I18n в verify.rb метод проверки не работает? - PullRequest
2 голосов
/ 10 сентября 2009

Я использую плагин I18n internationnalization, но он не переводит 1 часть информации:

В одном из моих контроллеров у меня есть метод проверки, подобный этому:

  # Verify user is authenticated
  verify :only => [ :destroy, :create, :update, :new, :comment ],
     :session => :user_id,
     :add_flash => { :error => I18n.t(:'Exceptions.not_logged_in') },
     :redirect_to => { :controller => 'main' , :action => 'index' }

Однако при использовании I18n.t (: 'Exceptions.not_logged_in') всегда отображается default_locale, в данном случае, английский.

В моем Application_Controller есть фильтр before_filter, который устанавливает локаль.

Кто-нибудь может мне помочь понять и помочь мне найти обходной путь?

Спасибо!

P.S .: Я пытался добавить вызов set_locale перед этим методом проверки без успеха (в моем контроллере)

Ответы [ 4 ]

4 голосов
/ 28 февраля 2011

Поскольку verify является методом класса, вызываемым на уровне определения класса, его аргументы, включая вызов I18n.t, оцениваются по мере загрузки контроллера. Чтобы I18n.t работал правильно, его необходимо оценивать каждый раз, когда выполняются соответствующие действия контроллера. verify не имеет возможности сделать это.

Вместо этого я предлагаю вам использовать фильтр before:

before_filter :verify_session, :only => [:destroy, :create, :update, :new, :comment]

def verify_session
  unless session[:user_id]
    flash[:error] = I18n.t('Exceptions.not_logged_in')
    redirect_to :controller => 'main', :action => 'index'
  end
end

Также обратите внимание, что verify устарел и перемещен в плагин в Rails 3, пока фильтры не продолжали работать.

1 голос
/ 28 февраля 2011

Перевод находится не в том месте; переведенная версия сообщения является строго проблемой пользовательского интерфейса, поэтому перевод должен происходить на уровне пользовательского интерфейса. FlashHash должен содержать только идентификаторы условий ошибки некоторого вида, код пользовательского интерфейса должен иметь дело с преобразованием этого в нечто, понятное человеку:

verify :only => [ :destroy, :create, :update, :new, :comment ],
     :session => :user_id,
     :add_flash => { :error => 'Exceptions.not_logged_in' },
     :redirect_to => { :controller => 'main' , :action => 'index' }

А потом, позже, в каком-нибудь ERB или где-то еще:

<% if flash[:error] %>
    <p class="error"><%= I18n.t(flash[:error]) %></p>
<% end %>

Этот подход также позволяет легко отправлять идентификаторы ошибок на REST-клиент или клиентский интерфейс JavaScript, не вынуждая их разбирать постоянно меняющиеся сообщения об ошибках:

if((flash.error || '') == 'Exceptions.not_logged_in')
    sammy.setLocation('#/sign_in');

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

0 голосов
/ 28 февраля 2011

Звони на I18n.t в паренсе

add_flash => { :error => (I18n.t(:'Exceptions.not_logged_in')) },
0 голосов
/ 10 сентября 2009

Я думаю, это может быть связано с тем, что вызов I18n.t выполняется только один раз, когда файл изначально загружается при запуске приложения. Вы можете попробовать обернуть его в процесс или лямбду или, возможно, в отдельный метод. например что-то вроде:

:add_flash => lambda { { :error => I18n.t(:'Exceptions.not_logged_in') } }

Не знаю, сработает ли это, но это может приблизить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...