2009-09-09 8 views
2

J'utilise plugin internationnalization I18n, mais il ne se traduit pas 1 élément d'information:Rails I18n dans vérification.rb vérifier la méthode ne fonctionne pas?

Dans l'un de mon contrôleur, j'ai vérifier méthode comme ceci:

# 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' } 

Cependant, l'utilisation I18n.t (: 'Exceptions.not_logged_in') affiche toujours le default_locale, dans ce cas, l'anglais.

J'ai dans mon Application_Controller un before_filter qui définit les paramètres régionaux.

Quelqu'un peut-il m'aider à comprendre, et m'aider à trouver une solution de contournement?

Merci!

PS: J'ai essayé d'ajouter un appel à set_locale avant que cette méthode de vérification sans succès (dans mon contrôleur)

Répondre

-1

Je pense qu'il pourrait avoir quelque chose à voir avec cet appel I18n.t étant exécuté qu'une seule fois lorsque le fichier est initialement chargé au démarrage de l'application. Vous pourriez essayer de l'emballer dans un Proc ou lambda ou peut-être dans une méthode séparée. par exemple. quelque chose comme:

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

Aucune idée si cela va fonctionner, mais il pourrait vous rapprocher.

+0

Bonne idée, mais il semble qu'elle refuse d'avoir un Proc là-dedans. Erreur msg est "pas marshal_dump est défini pour la classe Proc" – user62605

0

Mettre l'appel à I18n.t dans parens

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

Depuis verify est une méthode de classe appelée au niveau de la définition de la classe, ses arguments, y compris l'appel I18n.t, sont évaluées comme le contrôleur est chargé. Pour que le I18n.t fonctionne correctement, il doit être évalué chaque fois que les actions du contrôleur sont exécutées. verify n'a pas la capacité de le faire.

Au lieu de cela, je vous suggère d'utiliser un filtre avant:

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 

Notez également que verify a été désapprouvée et déplacé vers un plugin dans Rails 3, alors que les filtres avant continuent de travailler.

1

La traduction est au mauvais endroit; la version traduite du message est strictement un problème d'interface utilisateur, donc la traduction devrait avoir lieu au niveau de l'interface utilisateur. Le FlashHash ne doit contenir que des identificateurs d'état d'erreur de quelque sorte, le code d'interface utilisateur doit faire face à la conversion que pour quelque chose d'un humain peut comprendre:

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

Et puis, plus tard dans une ERB ou tout autre:

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

Cette approche permet également facile de pousser les ID d'erreur tout le chemin à un client REST ou JavaScript fin avant sans les forcer à traiter des messages d'erreur en constante évolution parsing:

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

Je ne peux pas être la seule personne dont le code de gestion des erreurs s'est cassé après une mise à niveau parce que quelqu'un a changé un message d'erreur et n'offrait aucun mécanisme d'erreur destiné à être consommé par les logiciels plutôt que par les humains.

+0

Je voulais voter ceci mais apparemment SO pense que j'ai déjà voté sur ceci et il ne me laisse pas faire cela à moins que vous éditiez un peu d'abord. – Behrang

+0

Okay maintenant, j'étais capable de vous voter. Mais je me souviens qu'il y a quelques jours, je voulais voter pour vous et j'ai appuyé par erreur sur le bouton de vote bas, puis j'ai appuyé très rapidement sur le bouton de vote en haut et cela a fonctionné et défait mon vote. Mais quand j'ai essayé de vous voter, il ne m'a pas laissé faire. J'ai attendu quelques jours et rien n'a changé. Alors probablement un bug SO. – Behrang

+0

@Behrang: Oui, on dirait que quelque chose était à moitié coincé quelque part dans les entrailles de SO. Je vais sortir mon "make it voteable" éditer maintenant. –

Questions connexes