2016-02-16 32 views
0

我正在学习MOOC,本练习的目标是为错字添加新功能,我可以将两篇文章合并到一起。Routes on Rails应用程序失败

当我添加路由到我的新功能合并到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 

正确的URL创建正确的网址:

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

你能发布你的实际链接吗?即你调用'delete_url'的'link_to'我怀疑你只需要添加'method::delete'就可以了。 –

+0

另外,你可以发布运行'rake routes |的输出grep内容“?另外,'admin/content_controller.rb'会对我们有所帮助。 –

回答

0

检查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 

有关的recources和CRUD操作请参见rails routing guide更多信息。

+0

你是对的! 我以为这只会创建一个'admin/content /:id/merge' 的路由(请参阅我编辑的原始发布的耙路由输出) 也没有显示操作... 是否有解决方法,所以我只是为合并创建一个路线? –

+0

是的,有:'资源:内容,除了:[:index,:show,:update,:destroy,:edit,:new,:create]' – guitarman

+0

但我只是把一个'post“/ content/id/merge“,转换为:”admin/content#merge“,如:: merge merge到命名空间而不是资源变体,因为它似乎不需要其他路由。 – guitarman

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 

,耙路线只是表明我希望其他合并路线和我的毁灭行动再次正常工作。