Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3.1命名路由查询来自演示者的参数问题_Ruby On Rails_Ruby On Rails 3.1 - Fatal编程技术网

Ruby on rails Rails 3.1命名路由查询来自演示者的参数问题

Ruby on rails Rails 3.1命名路由查询来自演示者的参数问题,ruby-on-rails,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 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 `ur

将应用程序从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'
...
在我的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\u controller/metal/url\u for.rb,而不是仅仅使用lib/action\u dispatch/routing/url\u for.rb中的url\u选项方法,但对于Rails源代码,我还是很不清楚。这在Rails 3.0.17中运行良好。如果有任何见解,我将不胜感激

看了这个提交后,我发现了问题所在

显然,如果您从控制器调用一个命名路由,您就可以了,因为env已经定义好了。但如果您从其他地方调用它,env没有定义,您必须自己定义它。由于它是从一个自编的presenter调用的,该presenter包含对控制器的引用,因此我在AnswerPagesPresenter的presenter超类中编写了以下方法,它现在可以工作了:

def env
  @controller.env
end

如何向演示者公开url\u helper方法?@gregates我在问题中添加了相关行,尽管我确实找到了解决方案,如您所见:凉的是的,我要说的是,通常我看到的模式是使用一个存储在实例变量(通常是@h)中的Helper对象初始化presenter,然后由h.url\u Helper调用url Helper,因为Helper可以访问请求、env等。所以这可能是另一种解决方案。@gregates有趣。你知道在网上我能找到这样的例子吗?
def env
  @controller.env
end