Rails 3.2自定义路由错误



在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,就像您在示例中所做的那样。

相关内容

  • 没有找到相关文章

最新更新