Rails:当我创建一个新对象1时,使第三个对象保存来自对象1和2的信息

时间:2012-12-04 18:13:06

标签: ruby-on-rails ruby forms nested

我有三个名为Product,Category和Categorization的模型。

产品型号:

    attr_accessible :title, :description, :price, :image_url
    has_many :categorizations
    has_many :categories, :through => :categorizations

类别模型:

    attr_accessible :name
    has_many :categorizations
    as_many :products, :through => :categorizations

分类模型:

    attr_accessible :category_id, :product_id
    belongs_to :category
    belongs_to :product

创建产品型号时如何创建分类对象?我在新产品表单中添加了类别选择。

基本上,当它创建新产品对象时,我想要推送product_id和选定的category_id并创建一个新的分类对象,以便我可以将产品与类别相关联。

_form.html for new product:

    <div>
        <%= f.label :title %>:<br />
        <%= f.text_field :title %><br />
      </div>
      <div>
        <%= f.label :description %>:<br />
        <%= f.text_area :description, :rows => 6 %>
      </div>
      <div>
        <%= f.label :price %>:<br />
        <%= f.text_field :price %><br />
      </div>
      <div>
        <%= f.label :image_url %>:<br />
        <%= f.text_field :image_url %><br />
      </div>

      <% @categories.each do |category| %>

      <div>
        <% f.fields_for :categorization do |builder| %>
        <%= render 'categorization_fields', :f => builder, :product => @product,         :category => category %>
      </div>
      <% end %>
      <% end %>

products_controller:

    def index
        @products = Product.all
      end

      def new
        @category = Category.all
        @product = Product.new
        @categories = @category.find(params[:category])
        categorization = @product.categorizations.build
      end

      def create
        @product = Product.new(params[:product])
        if @product.save
          redirect_to products_path
        else
          render :new
        end
      end

      def edit
        @product = Product.find(params[:id])
      end

      def update
        @product = Product.find(params[:id])
        if @product.update_attributes(params[:product])
          redirect_to @product
        else
          render :edit
        end
      end

      def show
        @product = Product.find(params[:id])
      end

      def destroy
        @product = Product.find(params[:id])
        @product.destroy
        redirect_to products_path
      end

    end

我无法在产品型号中使用accepts_nested_attributes_for这样工作。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

也许您需要为所需的关系添加autosave选项,例如:

has_many :categorizations, :autosave => true
accepts_nested_attributes_for :categorizations

这应该在保存您声明关系的模型时保存autosave'd关系。