0

在Rails 3.2.8网站,我收到以下错误:的Rails 3.2自定义路由错误

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 %> 

做当耙路线:

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

您的ID为零,这会导致路由错误。 – cih

+3

为什么不在'resources:tasks'中使用'get'complete''' –

+0

为什么id为零?在控制台中,我的所有任务都显示一个ID。 – Dobabeswe

回答

0

为什么不只是将其更改为以下内容?

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

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

而只是为了调试的目的,因为这可能会解决您原来的问题,我想补充以下略低于现有li标签,以观察变量,并确保他们都不是零:

<li>List ID: <%[email protected]%>, Task ID: <%=task.id%></li> 
+0

这有助于很多!谢谢! – Dobabeswe

+0

当然!很高兴帮助! – eriklinde

0

这个错误可能是因为一个或多个与@list相关的任务中有一个没有ID。最近的Rails版本非常挑剔有非零ID生成路径。

您正在获取的错误是试图告诉您某件事情是错误的(您正在为尚未保存的对象生成路由)。

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