在Verify.rbvalidation方法中的Rails I18n不起作用?
我正在使用I18n国际化插件,但它没有翻译1条信息:
在我的一个控制器中,我有一个这样的validation方法:
# 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,在本例中为english。
我在我的Application_Controller中有一个设置语言环境的before_filter。
任何人都可以帮助我理解,并帮助我找到解决方法吗?
谢谢!
PS:我尝试在此validation方法之前添加对set_locale的调用,但没有成功(在我的控制器中)
由于verify
是在类定义级别调用的类方法,因此在加载控制器时会评估其参数(包括I18n.t
调用)。 为了使I18n.t
正常工作,每次执行相关的控制器操作时都需要对其进行评估。 verify
没有能力这样做。
相反,我建议你使用之前的filter:
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
另请注意,在filter继续工作之前,已弃用verify
并将其移至Rails 3中的插件。
翻译是在错误的地方; 消息的翻译版本严格来说是用户界面问题,因此翻译应该在用户界面级别进行。 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] %> <%= I18n.t(flash[:error]) %>
<% end %>
这种方法还可以轻松地将错误ID一直推送到REST客户端或JavaScript前端,而无需强制它们处理解析不断变化的错误消息:
if((flash.error || '') == 'Exceptions.not_logged_in') sammy.setLocation('#/sign_in');
我不能成为唯一一个在升级后error handling代码崩溃的人,因为有人更改了错误消息,并且没有提供任何意图由软件而不是人类使用的错误机制。
在Parens中拨打I18n.t的电话
add_flash => { :error => (I18n.t(:'Exceptions.not_logged_in')) },
我认为它可能与I18n.t调用仅在文件最初在应用启动时加载时运行一次有关。 您可以尝试将其包装在Proc或lambda中,也可以使用单独的方法。 例如:
:add_flash => lambda { { :error => I18n.t(:'Exceptions.not_logged_in') } }
不知道这是否有效,但它可能会让你更接近。