1

将应用程序从 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 中运行良好。我将不胜感激任何见解!

4

1 回答 1

0

查看此提交后,我发现了问题所在https://github.com/rails/rails/commit/233be6572c96087192885924c6658a15d01a2a1b#actionpack/lib/action_controller/metal/url_for.rb

显然,如果你从控制器调用命名路由,你会没事的,因为 env 已经定义了。但是如果你从别的地方调用它, env 没有定义,你必须自己定义它。由于它是从一个自写的 Presenter(其中包含对控制器的引用)调用的,所以我只是在 Presenter(AnswerPagesPresenter 的超类)中编写了以下方法,它现在可以工作了:

def env
  @controller.env
end
于 2012-09-28T16:07:57.020 回答