我正在参加MOOC,本练习的目的是为拼写错误添加新功能,我可以将两篇文章合并在一起。
当我将路线添加到我的新功能合并到routes.rb时,我失去了删除文章的功能。我认为这里发生了一些冲突,但我不知道是什么。
原始routes.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
articles.rb中的此方法会创建正确的删除网址
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内容:
原始routes.rb给了我:
admin_content /admin/content {:controller=>"admin/content", :action=>"index"}
/admin/content(/:action(/:id)) {:action=>nil, :id=>nil, :controller=>"admin/content"}
而我修改的routes.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"}
答案 0 :(得分:0)
检查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
的请求将被定义为已定义的路由,但我知道您在控制器中没有显示操作。
更好:
{{1}}
有关资源和CRUD操作的更多信息,请参阅rails routing guide。
答案 1 :(得分:0)
好的,感谢@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路由只显示我想要的额外合并路径,我的销毁行动再次正常工作。