アプリを Rails 3.0.17 から 3.1.8 にアップグレードした後、名前付きルートの使用とクエリ パラメータの追加で奇妙なエラーが発生しました。
さかのぼって、関連するエラーとスタック トレースを次に示します。
NameError (undefined local variable or method `env' for #<AnswerPagesPresenter:0x0000000420df60>):
actionpack (3.1.8) lib/action_controller/metal/url_for.rb:36:in `url_options'
actionpack (3.1.8) lib/action_dispatch/routing/url_for.rb:148:in `url_for'
actionpack (3.1.8) lib/action_dispatch/routing/route_set.rb:207:in `edit_answer_sheet_page_path'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:81:in `new_page_link'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:91:in `block (2 levels) in page_list'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:90:in `each'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:90:in `block in page_list'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:89:in `each'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:89:in `page_list'
vendor/plugins/questionnaire_engine/app/presenters/answer_pages_presenter.rb:21:in `initialize'
app/controllers/applications_controller.rb:166:in `new'
app/controllers/applications_controller.rb:166:in `setup_view'
app/controllers/applications_controller.rb:19:in `show_default'
...
名前付きルートを呼び出している AnswerPagesPresenter のコードは次のとおりです (追加のクエリ パラメータである「a」変数に複数のものを使用してみましたが、通常は nil です)。
def new_page_link(answer_sheet, page, a = nil)
PageLink.new(page.label, edit_answer_sheet_page_path(answer_sheet, page, :a => a), dom_page(answer_sheet, page), page) if page
end
また、Presenter クラスの上部には、次のコード行があります。
include ActionView::Helpers::TagHelper # link_to
include ActionView::Helpers::UrlHelper # url_for
include ActionController::UrlFor # named routes
include ActionController::RecordIdentifier # dom_id
include Rails.application.routes.url_helpers
そして、有効なルートであることを示すためだけに「rake routes」コマンドを実行した関連行:
edit_answer_sheet_page GET /answer_sheets/:answer_sheet_id/page/:id/edit(.:format) {:action=>"edit", :controller=>"answer_pages"}
プラグインの routes.rb ファイルから:
resources :answer_sheets do
member do
post :send_reference_invite
post :submit
end
resources :page, :controller => :answer_pages do
member do
post :save_file
end
end
end
ここで何が起こっているか知っている人はいますか?lib/action_dispatch/routing/url_for.rb で url_options メソッドを使用するだけでなく、lib/action_controller/metal/url_for.rb に移動する理由を理解しようとしましたが、Rails に関してはまったくわかりません。ソースコード。Rails 3.0.17 では問題なく動作していました。洞察をいただければ幸いです。