2015-04-29 2 views
0

Я хочу интернационализировать внешний код (см. github) с i18n для рельсов. Я прочитал руководство для Rails Internationalization (I18n) API. Перевод текста не является проблемой, но основной код, похоже, не работает должным образом во всех ситуациях. К сожалению, я не специалист по рельсам/рубину.rails I18n неправильный порядок параметров в маршруте (id как locale и id is nil)

Из журнала:

FATAL -: ActionView :: Template :: Ошибка (нет маршрута не соответствует {: действие => "Изменить",: контроллер => "планы", формат: = > ноль,: идентификатор => ноль, : локаль => 115} отсутствуют необходимые ключи: [: ID]):

Таким образом, проблема в том, что параметр для идентификатора (= 115) передается как вместо слова locale вместо id.

Чтобы получить i18n рабочий я добавил следующий код в приложение/контроллеры/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 
... 

Кроме того, я обернул оригинальные маршруты в конфигурации/routes.rb:

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

Поэтому возникает вопрос: существует ли отсутствующий маршрут или есть проблема внутри кода или это просто моя ошибка. Помимо перевода текста и кнопок, я не изменил исходный код. Исходные routes.rb можно найти на github (sry, я не могу опубликовать ссылку, потому что у меня недостаточно репутации). Любые предложения/помощь были бы идеальными.

Редактировать Я думаю, что я немного ближе. Может быть, теперь более понятно, почему он не работает. Прежде всего «полной» StackTrace:

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' 

Если бы я попал в «Готово» кнопку на веб-странице, функция committed называется, которым называет create_plan_state(:committed). В определении create_plan_state есть оператор plan_state = PlanState.create(plan_id: @plan.id, state: state, user_id: current_user.id). Это вызывает функцию обратного вызова для 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 

Теперь это вызывает 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 

Я думаю, что определение уведомления не важно. Но третья последняя строка называет "dmp_owners_and_co_committed", которая определяется как:

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' %> 

И в _notification_boilerplate.text.erb есть:

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

Я думаю, что проблема edit_plan_url и edit_user_url. Потому что, если я добавлю какой-то случайный текст в качестве параметра, он работает ...:

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

Вопрос в том, почему он работает? Есть ли способ распечатать созданный маршрут? Потому что в stacktrace маршрут не соответствует, потому что формат и id равен нулю. Теперь я хочу увидеть новый маршрут, чтобы узнать, где находится моя случайная строка «de».

+0

удалите 'locale:/en | de /' с вашего маршрута и повторите попытку. – sadaf2605

+0

@ sadaf2605 К сожалению, это не имеет никакого эффекта, я все равно получаю сообщение об ошибке. – derDaywalker

+0

Вставьте форму, создав запрос. Похоже, вы ошибаетесь. – tebayoso

ответ

0

Похоже, что ваши маршруты ожидают двух параметров и заказывают его по мере надобности. Там есть способ избежать его, используя именованный хэш в Params прошло:

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

рельсам Automagic будет использовать символ для определения параметров и избежать проблем.

+0

Что касается размещения I18n.locale внутри вызова: это вариант, но вопрос в том, почему это необходимо. Потому что я думал, что задача выполнена в default_url_options (внутри application_controller). И это работает во многих случаях. Моя проблема заключается в том, что я не знаю полного кода. И если я исправлю это для этих двух случаев, может быть еще десять, чего я не знаю. Таким образом, я думал, что I18n делает это обычным способом через default_url_options. – derDaywalker

+0

Почему вы используете: edit_plan_url вместо edit_plan_path? Вы переименовали свои маршруты? – tebayoso

+0

Это не мой код. Я ничего не изменил в отношении этого фрагмента кода, поэтому не знаю, почему вместо edit_plan_path используется edit_plan_url. Я думаю, что edit_plan_url используется, потому что ссылка отправляется по почте. Моя цель - использовать этот код, но «внедрить» интернационализацию. Мы хотим использовать этот инструмент с открытым исходным кодом, но с другим языком. Если я покончу с интернационализацией, я предоставлю авторам «новую функцию». – derDaywalker

 Смежные вопросы

  • Нет связанных вопросов^_^