轨道上的路由应用程序失败



我正在学习MOOC,本练习的目标是为拼写错误添加新功能,我可以将两篇文章合并在一起。

当我将路由添加到我的新函数合并到 routes.rb 时,我失去了删除文章的功能。我认为这里有些冲突,但我不知道是什么。

原始路线.rb:

%w{advanced cache categories comments content profiles feedback general pages
resources sidebar textfilters themes trackbacks users settings tags redirects seo post_types }.each do |i|
  match "/admin/#{i}", :to => "admin/#{i}#index", :format => false
  match "/admin/#{i}(/:action(/:id))", :to => "admin/#{i}", :action => nil, :id => nil, :format => false
end

文章.rb 中的此方法创建用于删除的正确 url

def delete_url
 blog.url_for(:controller => "/admin/content", :action =>"destroy",:id => id)
end

正确的网址:

http://example.com/admin/content/destroy/7

如果我点击此链接,我可以成功删除一篇文章。

但是,如果我在此之前将以下内容添加到我的 routes.rb 中:

namespace "admin" do
 resources :content do
   post :merge, on: :member, as: :merge
 end
end

新的合并功能和表单工作正常,但方法delete_url现在生成如下内容:

http://example.com/admin/content/7

如果我按照此方法创建的链接进行操作,我会得到:

Unknown action
The action 'show' could not be found for Admin::ContentController

也许我正在覆盖某些内容?我无法弄清楚这里发生了什么以及为什么这会影响删除操作/路由。

提前感谢!

编辑:耙子路线| grep内容:

使用原始路线.rb 给我:

admin_content        /admin/content                     {:controller=>"admin/content", :action=>"index"}
                     /admin/content(/:action(/:id))     {:action=>nil, :id=>nil, :controller=>"admin/content"}

而我修改后的路由.rb 产生

merge_admin_content POST   /admin/content/:id/merge(.:format) {:action=>"merge", :controller=>"admin/content"}
admin_content_index GET    /admin/content(.:format)           {:action=>"index", :controller=>"admin/content"}
                   POST   /admin/content(.:format)           {:action=>"create", :controller=>"admin/content"}
 new_admin_content GET    /admin/content/new(.:format)       {:action=>"new", :controller=>"admin/content"}
edit_admin_content GET    /admin/content/:id/edit(.:format)  {:action=>"edit", :controller=>"admin/content"}
     admin_content GET    /admin/content/:id(.:format)       {:action=>"show", :controller=>"admin/content"}
                   PUT    /admin/content/:id(.:format)       {:action=>"update", :controller=>"admin/content"}
                   DELETE /admin/content/:id(.:format)       {:action=>"destroy", :controller=>"admin/content"}
                          /admin/content                     {:controller=>"admin/content", :action=>"index"}
                          /admin/content(/:action(/:id))     {:action=>nil, :id=>nil, :controller=>"admin/content"}

好的,多亏了@guitarman我完成了我的路由代码,发现我可以添加以下except

namespace "admin" do
 resources :content, except: [:index, :show, :update, :destroy, :edit, :new, :create] do
   post :merge, on: :member, as: :merge
 end
end

之后,耙子路线只显示我想要的额外合并路线,我的销毁操作再次正常工作。

检查rake routes命令。我认为有一条路线/admin/content/:id将由resources :contentnamespace "admin"中创建.您对http://example.com/admin/content/7的请求将被捕获为定义的路由,但我认为您在控制器中没有显示操作。

更好:

namespace "admin" do
  post "/content/:id/merge", to: "admin/content#merge", as: :merge
end

有关资源和 CRUD 操作的更多信息,请参阅导轨布线指南。

最新更新