2012-09-27 100 views
1

3.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」變量,嘗試這是額外的查詢參數,但它是無正常):

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 

此外,在我的演示類的頂部我有下面幾行代碼:

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 

而且從運行「耙路線」命令相關的行只是爲了顯示它是一個有效的途徑:

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 /金屬/ url_for.rb,而不是僅僅使用url_options方法的lib/action_dispatch /路由/ url_for.rb,但我很無知,當涉及到Rails的源代碼。這在Rails 3.0.17中工作得很好。我會很感激任何見解!

+0

你怎麼暴露url_helper方法給你的主持人? – gregates

+0

@gregates我在問題中添加了相關的行,儘管我確實找出了一個解決方案,正如你所看到的。 :) – Justin

+0

很酷。是的,我在那裏去的是,通常,我看到的模式與存儲在一個實例變量(通常@h)輔助對象初始化演示,然後URL助手由'h.url_helper'調用,由於助手可以訪問請求,env等等。所以這可能是一個替代解決方案。 – gregates

回答

0

我發現了什麼問題了看着這個承諾https://github.com/rails/rails/commit/233be6572c96087192885924c6658a15d01a2a1b#actionpack/lib/action_controller/metal/url_for.rb

顯然,如果你調用從控制器具名的路線,你會沒事的,因爲ENV已經定義了。但是如果你從別的地方調用它,env沒有定義,你必須自己定義它。因爲它正在從一個自寫演講(其中包含引用到控制器)叫,我只是在主持人(AnswerPagesPresenter的超)寫了下面的方法,它現在的作品:

def env 
    @controller.env 
end