在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
为什么不直接改成下面的呢?
<%= button_to "Complete", "/lists/#{@list.id}/tasks/#{task.id}/complete" %>
Rails的魔法是为了节省时间——因此它存在——但是如果要花更多的时间来弄清楚如何使用它,那么有时选择不使用那个魔法可能是有意义的;)
只是为了调试的目的,因为这可能会解决你原来的问题,我会在你现有的li
标签下面添加以下内容,以观察变量,并确保它们都不是nil:
<li>List ID: <%=@list.id%>, Task ID: <%=task.id%></li>
此错误可能是因为与@list关联的一个或多个任务的id为nil。最新版本的Rails对于使用非空id来生成路径非常挑剔。
你得到的错误是试图告诉你出了问题(你正在为尚未持久化的对象生成路由)。
虽然@eriklinde的解决方案可能"工作"(可能输出一个无效的路径丢失:id值),它不是一个好形式。手动构建url使得以后更新路径变得更加困难,并且可能隐藏了应用程序的问题。只要可能,应该使用xxx_path,就像您在示例中所做的那样。