Вопрос

Я пытаюсь установить связь «многие-ко-многим» между двумя объектами.Я прошел несколько уроков и смог правильно настроить модель.Моя проблема в том, что у меня возникли проблемы с настройкой правильных маршрутов, чтобы я мог просмотреть полную взаимосвязь...что-то вроде отображения продуктов только из определенной категории (/категории/1/продукты/)

Вот как я сгенерировал модель:

script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer

Вот схема:

ActiveRecord::Schema.define(:version => 20100205210519) do

  create_table "categories", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "categorizations", :force => true do |t|
    t.integer  "category_id"
    t.integer  "product_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "products", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

Вот 3 объекта модели:

class Category < ActiveRecord::Base
    has_many :categorizations
    has_many :products, :through => :categorizations
end

class Product < ActiveRecord::Base
    has_many :categorizations
    has_many :categories, :through => :categorizations
end

class Categorization < ActiveRecord::Base
    belongs_to :product
    belongs_to :category
end

Довольно просто, и вроде бы все работает нормально, потому что я могу добавить товар в категорию через консоль:

@category.categorizations << Categorization.new(:product_id => 1)

Я уверен, что мне нужно обновить файл router.rb, но я не знаю, как это сделать правильно.Вот что я поместил в файл маршрутов:

map.resources :categories, :has_many => :products

Когда я пытаюсь просмотреть продукты в категории «/categories/7/products/», там просто перечисляются все продукты!Означает ли это, что мой маршрут настроен правильно, и мне просто нужно написать специальное действие для контроллера продуктов (вместо того, чтобы оно индексировалось)?Что я здесь делаю не так...я близко или далеко?!?

Спасибо

Это было полезно?

Решение

Вероятно, вы не используете данные маршрута для фильтрации списка продуктов.

В вашем индексном методе product_controller вам нужно сделать что-то вроде:

Category.find(params[:category_id]).products

Другие советы

Что вы хотите сделать, так это использовать вложенные ресурсы.Общий формат выглядит следующим образом:

map.resources :users do |users|
  users.resources :posts
end

Подробнее об этом здесь.

Как предложено в этот вопрос, вы можете попробовать добавить параметр запроса :category_id в свой запрос поиска.

Всегда смотрите на вывод грабли маршруты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top