0

在 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
4

2 回答 2

0

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

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

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

于 2013-01-10T20:42:51.180 回答
0

为什么不直接将其更改为以下内容?

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

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

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

<li>List ID: <%=@list.id%>, Task ID: <%=task.id%></li>
于 2013-01-05T12:13:36.973 回答