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_dispatch/routing/url_for.rb で url_options メソッドを使用するだけでなく、lib/action_controller/metal/url_for.rb に移動する理由を理解しようとしましたが、Rails に関してはまったくわかりません。ソースコード。Rails 3.0.17 では問題なく動作していました。洞察をいただければ幸いです。

4

1 に答える 1

0

このコミットを見た後、問題が何であるかがわかりまし

コントローラーから名前付きルートを呼び出す場合は、env が既に定義されているため、問題ないようです。しかし、それ以外から呼び出す場合は env が定義されていないため、自分で定義する必要があります。自己作成のプレゼンター (コントローラーへの参照を含む) から呼び出されているため、Presenter (AnswerPagesPresenter のスーパークラス) に次のメソッドを記述したところ、現在は機能しています。

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