【问题标题】:Rails 3.2 Custom Route ErrorRails 3.2 自定义路由错误
【发布时间】:2013-01-04 15:56:48
【问题描述】:

在 Rails 3.2.8 站点中,我收到以下错误:

Routing Error
No route matches {:controller=>"tasks", :action=>"complete", :list_id=>1, :id=>nil}

在我的路线文件中,我有以下内容:

resources :lists do
  resources :tasks
end

match 'lists/:list_id/tasks/:id/complete' => 'tasks#complete', :as => :complete_task

在视图中:

<% @list.tasks.each do |task| %>
  <li><%= task.description %> - <%= button_to "Complete", 
                                    complete_task_path(@list.id, task.id) %></li>
<% end %>

在做 rake 路由时:

complete_task        /lists/:list_id/tasks/:id/complete(.:format) tasks#complete

【问题讨论】:

  • 你的id是nil,这样会导致路由错误。
  • 你为什么不在resources :tasks中使用get "complete"
  • 为什么id是零?在控制台中,我的所有任务都显示一个 id。

标签: ruby-on-rails ruby-on-rails-3 routes ruby-on-rails-3.2 custom-routes


【解决方案1】:

为什么不直接改成下面这样呢?

<%= button_to "Complete", "/lists/#{@list.id}/tasks/#{task.id}/complete" %>

Rails 魔法旨在节省时间 - 因此它存在 - 但如果需要更多时间来弄清楚如何使用它,那么有时选择不使用该魔法可能是有意义的 ;)

仅出于调试目的,因为这可能会解决您的原始问题,我将在您现有的 li 标记下方添加以下内容,以观察变量,并确保它们都不为零:

<li>List ID: <%=@list.id%>, Task ID: <%=task.id%></li>

【讨论】:

  • 这很有帮助!谢谢!
【解决方案2】:

此错误可能是因为与 @list 关联的一个或多个任务的 ID 为零。最近版本的 Rails 对使用非 nil id 来生成路径非常挑剔。

您遇到的错误是试图告诉您有问题(您正在为尚未持久化的对象生成路由)。

虽然@eriklinde 的解决方案可能“有效”(可能会输出一个缺少 :id 值的无效路径),但它的形式并不好。手动构建 url 会使以后更新路径变得更加困难,并且可能隐藏了您的应用程序的问题。只要有可能,您应该使用 xxx_path 帮助,就像您在示例中所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多