2015-04-29 1 views
0

Je veux internationaliser un code externe (voir github) avec i18n pour les rails. J'ai lu le guide pour Rails Internationalization (I18n) API. Traduire le texte n'est pas un problème, mais le code sous-jacent ne semble plus fonctionner correctement dans toutes les situations. Malheureusement, je ne suis pas un expert des rails/rubis.rails I18n mauvais ordre des paramètres dans l'itinéraire (id comme locale et id est nul)

du journal:

FATAL -: ActionView :: Template :: Erreur (Aucun itinéraire correspond {: action => "modifier",: controller => "plans",: format = > nil,: id => nil, : locale => 115} manquantes clés nécessaires: [: id]):

le problème est que le paramètre pour l'ID (= 115) est passé comme locale au lieu de id.

Pour obtenir i18n travail I a ajouté le code suivant dans l'application/controllers/application_controller.rb:

... 
    before_action :set_locale 

    protected 

    def set_locale 
    I18n.locale = params[:locale] || I18n.default_locale 
    end 

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

De plus, j'Enveloppez la config dans des itinéraires originaux/routes.rb:

Dmptool2::Application.routes.draw do 
    scope "(:locale)", locale: /en|de/ do 
    a lot of original routes 
    end 
end 

Par conséquent, la question est, y a-t-il une route manquante ou y a-t-il un problème dans le code ou est-ce simplement de ma faute? En plus de traduire le texte et les boutons, je n'ai pas changé le code original. Les routes.rb originales peuvent être trouvées sur github (sry, je ne peux pas poster le lien parce que je n'ai pas assez de réputation). Toute suggestion/aide serait parfaite.

Modifier Je pense que je suis un peu plus proche. Peut-être que maintenant c'est plus clair, pourquoi ça ne marche pas. tout d'abord le stacktrace « plein »:

F, [2015-05-04T16:43:58.600384 #19289] FATAL -- : 
ActionView::Template::Error (No route matches {:action=>"edit", :controller=>"plans", :format=>nil, :id=>nil, :locale=>#<Plan id: 158, name: "asdfe", requirements_template_id: 59, solicitation_identifier: "", 
submission_deadline: nil, visibility: :public, created_at: "2015-05-04 14:41:33", updated_at: "2015-05-04 14:43:48", current_plan_state_id: 300>} missing required keys: [:id]): 
    2: 
    3: The plan "<%= @vars[:plan].name %>" has been completed. 
    4: 
    5: If you have questions pertaining to this action, please visit the DMP Overview page at <%= edit_plan_url(@vars[:plan]) %> 
    6: 
    7: <%= render :partial => 'users_mailer/notification_boilerplate.text.erb' %> 
    app/views/users_mailer/dmp_owners_and_co_committed.text.erb:5:in `_app_views_users_mailer_dmp_owners_and_co_committed_text_erb__754483862330985648_69917281861000' 
    app/mailers/users_mailer.rb:32:in `notification' 
    app/models/concerns/plan_email.rb:50:in `block in email_dmp_saved' 
    app/models/concerns/plan_email.rb:49:in `email_dmp_saved' 
    app/models/plan_state.rb:31:in `update_current_plan_state' 
    app/controllers/plan_states_controller.rb:97:in `create_plan_state' 
    app/controllers/plan_states_controller.rb:73:in `committed' 

Si je frappe le bouton « fait » sur la page Web, la fonction committed est appelée, Wich appelle create_plan_state(:committed). Dans la définition de create_plan_state, il y a l'instruction plan_state = PlanState.create(plan_id: @plan.id, state: state, user_id: current_user.id). Cela déclenche un rappel pour after_create: update_current_plan_state:

def update_current_plan_state 
    #update the current plan pointer in the plan model 
    p = self.plan 
    p.current_plan_state_id = self.id 
    p.save! 
end 

Maintenant, ce qui déclenche after_save: email_dmp_saved:

def email_dmp_saved 
... 
if current_state.state == :committed 
    users = self.users 
    users.delete_if {|u| !u[:prefs][:dmp_owners_and_co][:committed]} 
    users.each do |user| 
    UsersMailer.notification(
     user.email, 
     "PLAN COMPLETED: #{self.name}", 
     "dmp_owners_and_co_committed", 
     {:user => user, :plan => self }).deliver 
    end 

Je pense que la définition de la notification n'a pas d'importance. Mais la 3ème dernière ligne appelle "dmp_owners_and_co_committed", qui est défini comme:

Hello <%= @vars[:user].full_name %>, 

The plan "<%= @vars[:plan].name %>" has been completed. 

If you have questions pertaining to this action, please visit the DMP Overview page at <%= edit_plan_url(@vars[:plan]) %> 

<%= render :partial => 'users_mailer/notification_boilerplate.text.erb' %> 

Et _notification_boilerplate.text.erb il y a:

You may change your notification preferences at <%= edit_user_url(@vars[:user].id) %>#tab_tab2 . 

Je pense que le problème est edit_plan_url et edit_user_url. Parce que si j'ajoute un texte aléatoire comme paramètre cela fonctionne ...:

edit_plan_url("de",@vars[:plan]) 
and in _notification: 
edit_user_url("de",@vars[:user].id) 

La question est, pourquoi cela fonctionne-t-il? Est-il possible d'imprimer l'itinéraire créé? Parce que dans la pile, la route ne correspond pas parce que le format et l'id est nul. Maintenant, je veux voir la nouvelle route afin de savoir où ma chaîne aléatoire "de" est placée.

+0

supprimez 'locale:/en | de /' de votre itinéraire et réessayez. – sadaf2605

+0

@ sadaf2605 malheureusement, cela n'a aucun effet, je reçois toujours l'erreur. – derDaywalker

+0

Collez le formulaire en créant la demande. On dirait que vous passez de mauvais paramètres. – tebayoso

Répondre

0

On dirait que vos routes attendent deux paramètres et les ordonnent comme ils viennent. Il y a un moyen d'éviter en utilisant une table de hachage dans les params passé:

edit_plan_url(id: @vars[:plan].id) 

Les rails Automagic utilisera le symbole pour identifier les param et éviter le problème.

+0

En ce qui concerne mettre I18n.locale à l'intérieur de l'appel: Ceci est une option, mais la question est, pourquoi est-ce nécessaire. Parce que je pensais que la tâche est faite dans default_url_options (dans le contrôleur_application). Et cela fonctionne pour de nombreux cas. Mon problème de faire ceci est que je ne connais pas le code complet. Et si je répare cela pour ces deux cas, il y en aura peut-être dix de plus, ce que je ne connais pas. J'ai donc pensé que I18n le fait d'une manière générale via default_url_options. – derDaywalker

+0

Pourquoi utilisez-vous: edit_plan_url au lieu de edit_plan_path? Avez-vous renommé vos itinéraires? – tebayoso

+0

Ce n'est pas mon code. Je n'ai rien changé concernant ce morceau de code, donc je ne sais pas pourquoi edit_plan_url est utilisé à la place de edit_plan_path. Je pense que edit_plan_url est utilisé, car le lien est envoyé par mail. Mon but est d'utiliser ce code, mais de "mettre en œuvre" l'internationalisation. Nous voulons utiliser cet outil open source, mais avec un langage différent. Si j'en ai fini avec l'internationalisation, je fournirai aux auteurs la "nouvelle fonctionnalité". – derDaywalker