使用form_for和一个奇异的模型

时间:2011-10-28 04:55:10

标签: ruby-on-rails form-for

我有一个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,是否有解决办法?)

1 个答案:

答案 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,但现在一切正常。