我正在学习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 :content
在namespace "admin"
中创建.您对http://example.com/admin/content/7
的请求将被捕获为定义的路由,但我认为您在控制器中没有显示操作。
更好:
namespace "admin" do
post "/content/:id/merge", to: "admin/content#merge", as: :merge
end
有关资源和 CRUD 操作的更多信息,请参阅导轨布线指南。