Я работаю над обновлением с Rails 4.0.13 до Rails 4.1.16 ... на пути к Rails 5.
@account и @facility - это экземпляры модели ActiveRecord, успешно извлеченные в контроллер FacilitiesController.
@account = #<Account id: 1863133034>
@facility = #<Facility id: 2035637533>
routes.rb выглядит так:
resources :accounts do
resources :facilities do
get :report
end
end
В консоли Rails 4.1.16 при запросе:
> request.env["REQUEST_PATH"]
=> "/accounts/1863133034/facilities/2035637533"
> params
{"action"=>"show", "controller"=>"facilities", "account_id"=>"1863133034", "id"=>"2035637533"}
> account_facility_report_path( @account, @facility, {})
=> "/accounts/1863133034/facilities/2035637533/report"
> account_facility_report_path( @account, @facility, params.merge( format: :pdf ) )
=> "/accounts/1863133034/facilities/1863133034/report.pdf?id=2035637533" # why different facility ID??
Теперь в сгенерированном пути изменился идентификатор объекта. Должен быть 2035637533, как в запросе _path, непосредственно предшествующем этому последнему.
Может ли кто-нибудь помочь мне понять разницу в поведении помощника _path из-за 3-го параметра?
В Rails 4.0 я не заметил такого поведения. Путь создается, как ожидалось, с идентификатором объекта в пути, установленным на 2035637533.
да. @facility остается без изменений.





Я предполагаю, что вы объединяете параметры, которые объединяют ключ id и устанавливают id для идентификатора учетной записи. Пытаться:
account_facility_report_path( @account, @facility, format: :pdf )
Итак ... это действительно решает проблему. Ура. Я предполагаю, что передача любой производной от params в помощнике пути в любом случае - плохая идея.
Перед тем, как вы сделаете последний маршрут, у объекта все еще тот же идентификатор?