Rails has_many through form with checkboxes and extra field in the join model

后端 未结 3 1930
长情又很酷
长情又很酷 2020-12-01 03:08

I\'m trying to solve a pretty common (as I thought) task.

There\'re three models:

class Product < ActiveRecord::Base  
  validates :name, presence         


        
3条回答
  •  悲&欢浪女
    2020-12-01 03:59

    use accepts_nested_attributes_for to insert into intermediate table i.e. categorizations view form will look like -

    # make sure to build product categorizations at controller level if not already
    class ProductsController < ApplicationController
      before_filter :build_product, :only => [:new]
      before_filter :load_product, :only => [:edit]
      before_filter :build_or_load_categorization, :only => [:new, :edit]
    
      def create
        @product.attributes = params[:product]
        if @product.save
          flash[:success] = I18n.t('product.create.success')
          redirect_to :action => :index
        else
          render_with_categorization(:new)
        end
      end 
    
      def update
        @product.attributes = params[:product]
        if @product.save
          flash[:success] = I18n.t('product.update.success')
          redirect_to :action => :index
        else
          render_with_categorization(:edit)
        end
      end
    
      private
      def build_product
        @product = Product.new
      end
    
      def load_product
        @product = Product.find_by_id(params[:id])
        @product || invalid_url
      end
    
      def build_or_load_categorization
        Category.where('id not in (?)', @product.categories).each do |c|
          @product.categorizations.new(:category => c)
        end
      end
    
      def render_with_categorization(template)
        build_or_load_categorization
        render :action => template
      end
    end
    

    Inside view

    = form_for @product do |f|
      = f.fields_for :categorizations do |c|
       %label= c.object.category.name
       = c.check_box :category_id, {}, c.object.category_id, nil
       %label Description
       = c.text_field :description
    

提交回复
热议问题