在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') } } 

不知道这是否有效,但它可能会让你更接近。