将应用程序从 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_controller/metal/url_for.rb 而不是只使用 lib/action_dispatch/routing/url_for.rb 中的 url_options 方法,但是当涉及到 Rails 时我很无能源代码。这在 Rails 3.0.17 中运行良好。我将不胜感激任何见解!