2013-06-13 239 views
1

我想支持:軌路由嵌套資源重複

POST images/1/comments/2/like 

POST comments/2/like 

它們都指向同同樣的動作相同的資源。我如何在rails路徑文件中做到這一點?

resources :images do 
    resources :comments do 
     member do 
     post 'like' 
     end 
    end 
    end 

這將工作的

POST images/1/comments/2/like 

,但我怎麼也因爲當我不指定images/1一部分?

回答

1

我會考慮返工其中您嵌套的Comment RESTful路線,你不是。我假設你的模型看起來是這樣的:

# app/models/image.rb 
class Image < ActiveRecord::Base 
    has_many :comments 
end 

# app/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :image 
end 

因爲你ImageComment車型擁有一個一對多的關係,我能明白你爲什麼會覺得嵌套圖像中的註釋資源路線一。然而,在comments_controller.rb所有CRUD操作中,僅create實際需要,父母圖像ID中被明確地傳遞。從REST風格的角度來看,只有newcreate操作需要一個image_id傳遞給動作。 edit,updatedeletelike操作都可以獨立於父映像進行。

考慮備選路由原理來代替:

# config/routes.rb 
resources :images do 
    resources :comments, :only => [:index, :new, :create] 
end 

resources :comments, :only => [:show, :edit, :update, :destroy] do 
    member do 
    post 'like' 
    end 
end 

現在,只有那些明確依賴父ID註釋行動實際上是嵌套在圖像路線之內。其餘評論操作直接路由到評論控制器,而不會傳入父代ID。您的路線不再重複,並且每個操作都會爲其聲明一條路線。

+0

感謝您的詳細回覆/解釋! – 0xSina

+0

當然。希望這一切都有道理。基本上,確保每個操作只有一條路由,可以讓應用程序保持乾爽,並避免需要添加一堆條件來處理從多個來源路由到的操作中的參數。 – zeantsoi

+0

這是一種遲到,但......通常有索引/新/創建評論資源的路徑不包括圖像的ID,而是將其包含在參數?所以不要說圖片/ 1 /評論,做評論/ 1?image_id = 5。哪一個更安寧?謝謝! – 0xSina

0

只需添加resources :images它可能工作

0

不知道還有一個更華麗的方式比這下面重複:

resources :comments do 
    member do 
    post 'like' 
    end 
end 

像這樣:

resources :images do 
    resources :comments do 
    member do 
     post 'like' 
    end 
    end 
end 

resources :comments do 
    member do 
    post 'like' 
    end 
end 
1

實際上可以讓它更漂亮。根據http://ruby-journal.com/how-to-dry-your-rails-routes/,這也適用:

comments = Proc.new do 
    member do 
    post 'like' 
    end 
end 

resources :comments, &comments 

resources :images do 
    comments.call 
end 

,並在軌道4,您可以使用關注

concern :comments_concern do 
    member do 
    post 'like' 
    end 
end 

resources :comments, concerns: :comments_concern 

resources :images, concerns: :comments_concern do 
    #do more stuff here 
end 

我沒有測試這一點,但它可能的幫助。看看提到的網站。祝你好運

-frbl