Как назначить значения, используя fields_for с ассоциацией has_many в rails 3 - PullRequest
3 голосов
/ 18 февраля 2011

У меня есть 2 модели, как описано ниже. Я хотел бы сделать так, чтобы при создании продукта пользователю приходилось выбирать из категорий, которые существуют в таблице категорий.

Таблица:

продукты: id, name

категории: идентификатор, имя

category_products: category_id, product_id

class Product
    has_and_belongs_to_many :categories
    accepts_nested_attributes_for :categories
end

class Category
    has_and_belongs_to_many :products
end

class ProductsController < ApplicationController
    def new
        @product = Product.new
        @product.categories.build
    end

    def create
        @product = Product.new(params[:product])
        if @product.save
            redirect_to @product, :notice => "Successfully created product."
        else
            render :action => 'new'
        end
    end
end
* +1011 * Вид / произведения / new.haml
= form_for @product do |f|
    = f.text_field :name
    = f.fields_for :categories do |cat_form|
        = cat_form.collection_select :id, Category.all, :id, :name, :prompt => true

Однако, это терпит неудачу и дает мне: Не удалось найти категорию с идентификатором = 3 для продукта с идентификатором =

Я хотел бы просто иметь возможность назначить существующую категорию для продукта при создании. Есть ли простой способ сделать это?

1 Ответ

1 голос
/ 18 февраля 2011

Вам нужно использовать accepts_nested_attributes_for, только если вы действительно обновляете categories из вашей формы. Если все, что вы делаете, это выбираете одну категорию для добавления вашего нового продукта, вы можете упростить все, как это:

class Product
  belongs_to :category
end

class Category
  has_many :products
end

class ProductsController < ApplicationController
  def new
    @product = Product.new
  end

  def create
    @product = Product.new(params[:product])
    if @product.save
      redirect_to @product, :notice => "Successfully created product."
    else
      render :action => 'new'
    end
  end
end

Если вы относите товар только к одной категории, вам не нужны отношения многие ко многим.

Что касается вида:

= form_for @product do |f|
  = f.text_field :name
  = f.collection_select :category_id, Category.all, :id, :name, :prompt => true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...