link_to по моделям ассоциаций - PullRequest
0 голосов
/ 20 марта 2012
  • ruby ​​1.9.2p290
  • рельсы 3.1.1

У меня есть две модели: RECIPE и RECIPE_CATEGORY с ассоциацией "own_to" и "has_many" соответственно.

Я могу перечислить все рецепты по категориям по этому URL:

http://localhost:3001/recipes/salads

Но в моем "link_to", который указывает на список рецептов по категориям, похоже, работает только в вашем собственномдействие: recipes # 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

Желаемые URL-адреса

  • localhost: 3001 / recipes / - список рецептов
  • localhost: 3001 / recipes / 21681 - показать страницу рецепта
  • localhost: 3001 / рецепты / салаты - показать рецепты по категориям
  • localhost: 3001 / recipes / lunch -показывать рецепты по часам дня

Итак, как построить "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

  • localhost: 3001 / recipes - список всех рецептов
  • localhost: 3001 / recipes/ категории - список всех категорий
  • localhost: 3001 / рецепты / категории / салаты * - список рецептов по категориям

РЕШЕНИЕ

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

1 Ответ

1 голос
/ 20 марта 2012

Если вам нужна ссылка на страницу со списком всех рецептов в данной категории, лучше всего настроить рецепты как вложенный ресурс для 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. Если это не то, что вы ищете, уточните в своем вопросе.

Изменить:

Вы можете прикрепить параметр к URL-адресу индекса и добавить в свой индекс улов, который отфильтровывал бы стандартное представление индекса, вплоть до тех рецептов, которые соответствуют параметру.

Итак, ваша ссылка на звонки будет выглядеть так:

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 

Это не самый красивый, и я не уверен, насколько "рельс" этот подход, но он работает для меня в этих ситуациях. Дайте мне знать, если это то, что вы ищете, или я снова пропустил.

...