我有一个Wizard
模型,客户端引用了一个ID(它保存在会话中),所以我为:show和:update创建了一个独特的资源。我希望管理员可以通过索引访问该模型的所有实例,因此管理员可以删除strays,所以我为:index和:destroy添加了多个资源。索引和销毁工作,但我无法找出在更新视图中传递给form_for的正确参数。
# config/routes.rb
WTest::Application.routes.draw.do
resource :wizard, :only => [:show, :update]
resources :wizards, :only => [:index, :destroy]
...
end
导致
$ rake routes
wizards GET /wizards(.:format) {:action=>"index", :controller=>"wizards"}
wizard DELETE /wizards/:id(.:format) {:action=>"destroy", :controller=>"wizards"}
GET /wizard(.:format) {:action=>"show", :controller=>"wizards"}
PUT /wizard(.:format) {:action=>"update", :controller=>"wizards"}
这会按照我期望的方式设置路线。
在控制台中:
>> app.wizard_path
引发错误ActionController::RoutingError: No route matches {:action=>"destroy", :controller=>"wizards"}
这是为什么?我是否错误地设置了路线?我需要在向导的更新视图中为form_for()指定:url => wizard_path
。
如果我在调用form_for时指定了一个显式路径:
# app/view/wizards/update.html.erb
<%= form_for @wizard, :url => wizard_path do |f| %>
<%= f.submit %>
<% end %>
...然后尝试渲染它会在form_for行上出错:
No route matches {:action=>"destroy", :controller=>"wizards"}
我不知道为什么它试图匹配破坏行动。如何让表单提交到{action=>"update", :controller=>"wizards"}
路线?
(顺便说一下,我查看了bug 267,我认为它与我观察的不一样。但如果是这个bug,是否有解决办法?)
答案 0 :(得分:0)
继承回答我自己问题的悠久传统(嗯!),我想我已经明白了。如果我的分析错了,我很乐意给别人一个复选标记...
查看rake routes
$ rake routes
wizards GET /wizards(.:format) {:action=>"index", :controller=>"wizards"}
wizard DELETE /wizards/:id(.:format) {:action=>"destroy", :controller=>"wizards"}
GET /wizard(.:format) {:action=>"show", :controller=>"wizards"}
PUT /wizard(.:format) {:action=>"update", :controller=>"wizards"}
路径方法'wizard_path'是不明确的:它可以引用DELETE子句,在这种情况下它需要:id参数(wizard_path(22)
),或者它可以引用GET和PUT子句,在在哪种情况下它不需要ID参数。
所以我的解决方案是创建一个专门用于删除的路由。我修改后的routes.rb
文件现在为:
resources :wizards, :only => [:index]
resource :wizard, :only => [:show, :update]
match 'wizard/:id' => 'wizards#destroy', :via => :delete, :as => :delete_wizard
和rake routes
现在生成:
$ rake routes
wizards GET /wizards(.:format) {:action=>"index", :controller=>"wizards"}
wizard GET /wizard(.:format) {:action=>"show", :controller=>"wizards"}
PUT /wizard(.:format) {:action=>"update", :controller=>"wizards"}
delete_wizard DELETE /wizard/:id(.:format) {:controller=>"wizards", :action=>"destroy"}
我需要对wizards / index.html.erb中的删除链接进行一行更改才能使用新的delete_wizard_path,但现在一切正常。