2016-02-16 58 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 

,耙路線只是表明我希望其他合併路線和我的毀滅行動再次正常工作。