Отображение категорий в поле выбора

Новичок в Rails здесь. У меня есть модель Product и ProductCategory, продукт принадлежит к категории продуктов, а в категории продуктов много продуктов. Мой исходный файл:

product_categories = [
    {:category => "Arts", :category_type => "physical" },
    {:category => "Books", :category_type => "physical" },
    {:category => "Diy & Craft", :category_type => "physical" },
    {:category => "Ebook", :category_type => "digital" },
    {:category => "Gadgets", :category_type => "physical" },
        etc.

]

В моем продукте-> новый метод

@categories = ProductCategory.where("category_type = ?", params[:category_type])
@product = @categories.products.new(params[:product])

Я получаю эту ошибку -> неопределенный метод `products' для # ActiveRecord::Relation:0x007fb34b1010c0> Я знаю, что это потому, что @categories не содержит только одну строку, но я хочу как-то установить связь. Затем в моем файле просмотра я хочу получить категории и отобразить их в поле выбора.

<%= collection_select :product, :category_id, @categories, :id, :name, @product.category_id %>

Как лучше всего это сделать? Спасибо.


person Skyalchemist    schedule 15.06.2013    source источник


Ответы (1)


У вас есть несколько результатов (ActiveRecord::Relation), возвращаемых этим запросом:

@categories = ProductCategory.where("category_type = ?", params[:category_type])

Если вы уверены, что у вас есть только один результат в запросе, вы должны поставить .first в конце.

@category = ProductCategory.where("category_type = ?", params[:category_type]).first

Кроме того, у вас есть ошибка во втором запросе. Вы вызываете новый метод для коллекции. Вы должны попробовать это:

@product = @category.products << Product.new(params[:product])

И не забудьте сохранить вашу модель.

person Ermin Dedovic    schedule 15.06.2013
comment
Спасибо, а что, если я хочу, чтобы категории содержали все категории, которые я хочу отобразить в поле выбора? Если я использую .first, не будет ли отображаться только одна категория в поле выбора? - person Skyalchemist; 15.06.2013
comment
Тогда вам не нужен .first, вам нужно получить доступ к определенной категории или перебрать их все (используя .each или что-то подобное). Но здесь вы хотите добавить Product в ProductCategory? - person Ermin Dedovic; 15.06.2013
comment
Ха, я вижу, я думаю, что я пройдусь по всем из них, помощников по выбору формы не хватает. - person Skyalchemist; 15.06.2013
comment
@Skyalchemist Нет, у вас есть помощник выбора формы, он называется collection_select. Я просто не понял вопроса. api.rubyonrails.org/classes/ActionView/Helpers/ - person Ermin Dedovic; 15.06.2013
comment
Спасибо, но выбор коллекции выдает эту ошибку неопределенное имя метода для #‹ProductCategory:0x007fb349a672b0› - person Skyalchemist; 15.06.2013
comment
Можете ли вы дать мне свою модель и синтаксис collection_select, который вы пытаетесь использовать? - person Ermin Dedovic; 15.06.2013
comment
Модельный продукт принадлежит_к: ProductCategory и Model ProductCategory has_many:products - person Skyalchemist; 15.06.2013
comment
‹%= collection_select :product, :category_id, @categories, :id, :name, @ product.category_id %› - person Skyalchemist; 15.06.2013
comment
У вас есть атрибут имени в вашей ProductCategory? - person Ermin Dedovic; 15.06.2013
comment
У вас есть столбец с именем (или поле, или как вы хотите его назвать) в вашей категории продуктов? - person Ermin Dedovic; 15.06.2013
comment
Нет, совсем нет. О, так вот причина. О Боже, не могу поверить, насколько я глупа. Большое спасибо за вашу помощь @Ermin - person Skyalchemist; 15.06.2013
comment
давайте продолжим обсуждение в чате - person Ermin Dedovic; 15.06.2013