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.
supprimez 'locale:/en | de /' de votre itinéraire et réessayez. – sadaf2605
@ sadaf2605 malheureusement, cela n'a aucun effet, je reçois toujours l'erreur. – derDaywalker
Collez le formulaire en créant la demande. On dirait que vous passez de mauvais paramètres. – tebayoso