Rails应用程序上的路由失败

时间:2016-02-16 13:39:12

标签: ruby-on-rails ruby ruby-on-rails-3 routes

我正在参加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"}

2 个答案:

答案 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路由只显示我想要的额外合并路径,我的销毁行动再次正常工作。