2014-03-05 54 views
0
  • 紅寶石2.0.0p247
  • 的Rails 4.0.0

是否有可能同一個URL包含不同的ID參數?軌道路線:相同的URL不同的ID參數

讓我來解釋更多細節。我希望這些相對路徑:

  • 食譜/素食(食譜/:kind_id)
  • 食譜/飲料(receitas /:CATEGORY_ID)

「種」 和 「類別」 是兩種不同的模式與自己的身份證和「配方」有相同的關係。

我有關聯關係:

recipe.rb

belongs_to :kind 
belongs_to :category 

的routes.rb

resources :recipes, :only => "index" do 
    collection do 
     get :kind, :to => "recipes#index", :path => ":kind_id" 
     get :category, :to => "recipes#index", :path => ":category_id" 
    end 
end 

耙路線

kind_recipes GET /receitas/:kind_id(.:format)  recipes#index 
category_recipes GET /receitas/:category_id(.:format) recipes#index 

配方#索引

if params[:kind_id] 
    @kind = Kind.find_by_slug(params[:kind_id]) 
    @recipes = @kind.recipes 

elsif params[:category_id] 
    @category = Category.find_by_slug(params[:category_id]) 
    @recipes = @category.recipes 
end 

當我訪問 「食譜/飲料」(飲品是 「CATEGORY_ID」)傳遞的參數爲 「kind_id」,因爲路線順序。

我錯過了什麼?

回答

0

當Rails進行路由時,它實際上並未在數據庫中查找匹配的數據。因此,在不查看數據的情況下,您的兩條路線完全相同,變量(kind_id & category_id)的名稱不同。如果您通過example/recipes/some_name獲取請求,則由於兩條路由都匹配請求,因此rails將與第一個匹配。

您需要在路徑中指示其類別或種類的內容。如果您真的永遠不會擁有同名的類別和種類,那麼您可以只使用一條路線,並嘗試匹配控制器中數據庫的類別或種類。

+0

Isee。太遺憾了! 感謝@PierrePretorius的答案。 我以爲我從路由傳遞參數到控制器(:kind_id和:category_id)。所以如果我把所有的東西放在一起(類別和種類),我通常可以使用counter_cache嗎?知道「種類」和「類別」是必需的,這一點很重要。所以我不能只使用category_id for counter_cache,我需要在食譜表上使用類似category_id和category_kind_id來處理counter_cache。 你能理解我嗎? – maiconsanson

+0

我在想我必須將我的關聯更改爲「多對多」(如「標記方式」)才能對counter_cache做正確的事情,對嗎? – maiconsanson

+0

您也可以在recipes_model中添加一個名爲'tag_count'的方法,該方法在內部添加kind和類別的計數器緩存。 –