2012-03-19 86 views
0
  • 紅寶石1.9.2p290
  • 軌3.1.1

我有兩個型號:配方和RECIPE_CATEGORY分別 「belongs_to的」 和 「的has_many」 關聯。的link_to通過關聯模型

我可以很好地通過這個網址按類別列出了所有的食譜:

http://localhost:3001/recipes/salads

但在這種按類別指向配方列表我「的link_to」似乎在自己的行動唯一的工作:食譜#list_by_category

<%= link_to recipe.recipe_category.name, recipe_category_recipes_path(@recipe_categories) %> 

的RecipesController

def index 
@recipes = Recipe.where({ :status_id => 1 }).includes(:chef, :recipe_category).order("updated_at desc").page(params[:page]).per(
end 

def list_by_category 
@recipe_category = RecipeCategory.find_by_name_plural(params[:recipe_category_id]) 
@recipes = @recipe_category.recipes.where(:status_id => 1).includes(:chef).order("id desc").page(params[:page]).per(9) 
end 

路線

resources :recipes, :id => /[0-9]+/ do 
match 'pagina/:page', :action => :index, :on => :collection # Kaminari 
# list of recipes by category 
get 'recipe_category', :to => 'recipes#list_by_category', :path => ':recipe_category_id', :on => :collection, :recipe_category_id => /[a-z]+/ 
end 

期望URLS

  • 本地主機:3001 /食譜/ - 食譜
  • 本地主機的列表: - :3001 /食譜/沙拉- 顯示食譜由類別
  • 顯示食譜的頁面
  • 本地主機3001 /食譜/ 21681 本地主機:3001 /食譜/午餐- 顯示食譜以一天中每小時

那麼,如何建立一個「的link_to」跨所有按類別分食譜行動?

我清楚嗎?如果我不是,請告訴我。

編輯

的RecipesController

def index 
    if params[:category_id] 
    @category = Category.find_by_slug(params[:category_id]) 
    @recipes = @category.recipes.where(:status_id => 1).includes(:chef).order("updated_at desc").page(params[:page]).per(9) 
    else 
    @recipes = Recipe.where({ :status_id => 1 }).includes(:chef, :category).order("updated_at desc").page(params[:page]).per(9) 
    @count_all = Recipe.where({ :status_id => 1 }).count() 
    end 
end 

路線

resources :categories, :path => "recipes/categories", :only => :index do 
    resources :recipes, :path => "", :only => :index do 
    match 'pagina/:page', :action => :index, :on => :collection 
    end 
end 
resources :recipes, :path => 'receitas', :id => /[0-9]+/ do 
    match 'pagina/:page', :action => :index, :on => :collection 
end 

URLS

  • 本地主機:3001 /食譜- 列表中的所有食譜
  • 本地主機:3001 /食譜/類別- 列出所有類別
  • 本地主機:3001 /食譜/分類/沙拉* - 名單配方按類別

SOLUTION

<%= link_to recipe.name, category_recipes_path(recipe.category.slug) %> 
+1

我不得不說:Rails是關於以下命名約定,它們使事情變得明顯和容易。 「RecipeCategory」不是模型的通常名稱。類別是一個模型。食譜是一個模型。一旦你這樣想了,我認爲你的問題的答案可能會更明顯一些。好的,所以我把它放在胸前:-) 一般答案:路線用於建立映射到控制器操作的URL。如果你遵循REST模式,你會爲自己節省一些工作和困惑。 – 2012-03-19 21:52:40

+0

嗨tharrison,謝謝你的回答。當你看到時,我是新的紅寶石/鐵軌。 但是,關於名稱的模型,我必須說在這個項目中有很多種類的類,比如TipCategory,MenuCategory等......這是我發現組織各種類別的方式。 在這種情況下,你有關於名稱的建議嗎? 關於「link_to」?我對link_to構造有點困惑,我相信這不僅僅是命名約定。 謝謝。 – maiconsanson 2012-03-20 12:10:44

+0

命名是Rails如何工作的核心 - 它取代了您需要的大量配置。也許如果你有多種類型的類別,你可以在類別表中添加一個「類型」字段?如果你只是在尋找答案,我已經在下面添加了一個:-)。 – 2012-03-20 13:30:05

回答

1

如果你想有一個鏈接到一個網頁,列出了在給定類別中的所有食譜,哪些可以最好的工作狀態來設置的食譜作爲recipe_category的嵌套資源:http://guides.rubyonrails.org/routing.html#nested-resources

路由看起來是這樣的:

resources :recipe_categories do 
    resources :recipes 
end 

這將允許你使用的鏈接是這樣的:

recipe_category_recipes_path(recipe_category) 

這將路線將顯示在recipe_category所有配方的頁面。如果這不是你想要的,請在你的問題中澄清。

編輯:

你可以釘在一個參數的索引網址,並添加索引的catch那種能夠篩選標準索引視圖只匹配參數的食譜。

所以你的軌道鏈接到電話應該是這樣的:

recipes_path(:category => @category) 
recipes_path(:time => @time) 

這將導致的URL看起來像這樣:

localhost:3001/recipes?category=salads 
localhost:3001/recipes?time=lunch 

而且在你的食譜控制器索引方法可以改變到這樣的事情:

def index 
    if params[:category] 
     Recipe.where("category = ?", params[:category]) 
    else if params[:time] 
     Recipe.where("time = ?", params[:time]) 
    else 
     @recipes = Recipe.all 
    end 
end 

這不是最漂亮的,我不是sur e這種方法的「軌道」如何,但在這些情況下適用於我。讓我知道這是你在找什麼,或者如果我錯過了。

+0

嗨,我已經按照上面的建議改變了模型的名字(謝謝tharrison)。 numbersnelson,你能看看我想要的網址嗎?我需要一些自定義網址,而且我不能像您的建議那樣簡單地使用嵌套資源。或者我錯了?謝謝! – maiconsanson 2012-03-21 15:13:18

+0

用另一種方式查看我的編輯回覆,並讓我知道如果這是你正在尋找。 – numbersnelson 2012-03-21 20:06:16

+0

你好數字!非常感謝您花費您的時間!我真的很喜歡你的建議,只有一個動作。我也對路線做了一些改變。謝謝。但是,recipes_path(:category => @category)只有當我有params [:category]時纔有效。我想在索引行動的所有條件下工作。怎麼做?我清楚了嗎?對不起,我的英語! – maiconsanson 2012-03-23 18:15:18