路线规范似乎与生成的方法不匹配

Posted

技术标签:

【中文标题】路线规范似乎与生成的方法不匹配【英文标题】:Route specification doesn't seem to match generated method 【发布时间】:2012-11-08 13:45:15 【问题描述】:

当我刷新页面时,我收到以下错误消息:

ActionController::RoutingError (No route matches :action=>"value", :controller=>"round"):
  app/views/surveys/survey.html.erb:28:in `block in _app_views_surveys_survey_html_erb___3955880096442191391_70175035205180'
  app/views/surveys/survey.html.erb:22:in `_app_views_surveys_survey_html_erb___3955880096442191391_70175035205180'
  app/controllers/surveys_controller.rb:16:in `block (2 levels) in survey'
  app/controllers/surveys_controller.rb:14:in `survey'    
  Rendered /Users/pitosalas/.rvm/gems/ruby-1.9.3-p194@repeatsurvey/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.5ms)

我对此感到非常困惑。为什么对 program_participant_round_value_path 的引用导致该路由丢失?

这是我的路线文件:

root to: 'programs#index'
  resources :programs do
    resources :participants do
      get 'survey' => 'surveys#survey'
    end
    resources :questions
    resources :rounds
    member do
      get 'report' => 'reports#report'
    end
  end
  resources :program do
    resources :participant do
      resources :round do
        put :value
      end
    end
  end

这里是相关的 rake routes 行:

program_participant_round_value PUT    /program/:program_id/participant/:participant_id/round/:round_id/value(.:format) round#value

我有一个控制器动作 round#value。

这是视图的相关部分:

<%= content_tag :table do %>
  <%= content_tag :thead do %>
    <% 5.times do |q| %>
      <%= content_tag :th, "1" %>
    <% end %>
  <% end %>
  <% form_tag program_participant_round_value_path do %>
    <%= content_tag :tbody do %>
      <%= render partial: 'surveys/value', collection: @values  %>
    <% end %>
    <%= submit_tag "Save" %>
  <% end %>
<% end %>

谢谢!

【问题讨论】:

【参考方案1】:

您的 program_participant_round_value 路由需要几个参数:

:program_id :participant_id :round_id

您需要在调用program_participant_round_value_path 助手时为这些参数提供值:

program_participant_round_value_path(program_id: @program, participant_id: @participant, round_id: @round)

当然,变量名称等可能会略有不同,具体取决于您在控制器中定义它们的方式。

【讨论】:

这会影响它寻找的路线吗?奇怪的。让我尝试。谢谢! 好的进度,但现在我收到错误:没有路由匹配 :action=>"value", :controller=>"round", :program=>1, :participant=>2, :round=>9 所以我需要对路线进行一些更改。但在我走这条路之前,我宁愿提交表单的 url 看起来像 ./program/1/participant/2/round/3/update。你似乎知道这玩意儿很冷。你能给我指点一下吗?谢谢 10^6 确保将method: :put 作为参数传递给form_tag 您是否已有RoundsController#update?如果是这样,最后得到/update 看起来会很乱。否则,您应该是 RESTful 并保持 /update 关闭,只将 PUT 设置为 /program/1/participant/2/round/3。这是更传统的做法。如果您想进一步探索这一点,我建议您开始一个新问题并在此处的评论中链接到它。如果你愿意,我可以帮助解决这个话题。我沉迷于获得 Stack Overflow 积分。 :) 这是新问题:***.com/questions/13293929/…

以上是关于路线规范似乎与生成的方法不匹配的主要内容,如果未能解决你的问题,请参考以下文章

自定义路线推翻新星路线

PostGIS - 路线匹配解决方案

Googleway R Alternative路线

以良好的性能服务于数百万条路线

苗条生成树Slim Span 与舒适的路线——刘汝佳的最小极差生成树(至少我第一次看到这种方法是从刘汝佳那里学来的)

没有路线匹配错误