在rails中创建Join表后,类别停止保存

时间:2016-05-10 18:55:32

标签: ruby-on-rails associations jointable

这是我第一次创建一个Join表,我有点卡住了。我有两个表:类别和产品。我最初设置了产品属于类别和类别有很多产品。我刚刚创建了一个连接表,并将我的关联更改为has_and_belongs_to_many。

我有一个表单,可以为产品选择多个类别,但所选的类别不再保存在数据库中。

在我的控制器中,我已经在我的产品参数中为category_id创建了一个数组,我想知道我的数据库中是否还有需要更新的内容?我应该更改数据库中的categroy_id吗?

以下是我的表格:

create_table "categories_products", id: false, force: :cascade do |t|
    t.integer "category_id", null: false
    t.integer "product_id",  null: false
  end

create_table "categories", force: :cascade do |t|
    t.string   "name"
    t.text     "description"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "product_id"
    t.integer  "category_id"
  end
create_table "products", force: :cascade do |t|
    t.string   "title"
    t.text     "description"
    t.string   "image_url"
    t.integer  "price"
    t.datetime "created_at",                 null: false
    t.datetime "updated_at",                 null: false
    t.string   "image",       default: "{}"
    t.integer  "category_id"
    t.integer  "product_id"
  end

以下是我的模特协会:

class Product < ActiveRecord::Base 
has_and_belongs_to_many :categories, :join_table => :categories_products

class Category < ActiveRecord::Base  
has_and_belongs_to_many :products, :join_table => :categories_products

我的新产品表单中的类别选择器:

<div class="field">
    <%= f.label :category_ids %><br>

    <%= f.select :category_ids, Category.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %>
</div>

产品控制器:

class ProductsController < ApplicationController
  before_filter :authenticate_admin!, :except => [:index, :show, :earings]
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  # GET /products
  # GET /products.json

   def index
    @products = Product.all

    respond_to do |format|
      format.html # index.html.erb
      format.js # index.js.erb
      format.json { render json: @products }
    end 
   end 


  def show

  end


  def new
    @products = Product.new
    @categories = Category.order(:name)
  end
  # GET /products/1/edit
  def edit
     @categories = Category.order(:name)
  end

  # POST /products
  # POST /products.json
  def  create
    @products = Product.new(product_params)

    respond_to do |format|
      if @product.save
        format.html { redirect_to  @product, notice: 'Product was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /products/1
  # PATCH/PUT /products/1.json
  def update

    respond_to do |format|
      if @product.update(product_params)
        format.html { redirect_to @product, notice: 'Product was successfully updated.' }
        format.json { render :show, status: :ok, location: @product }
      else
        format.html { render :edit }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /products/1
  # DELETE /products/1.json
  def destroy
    @product.destroy
    respond_to do |format|
      format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' }
      format.json { head :no_content }
     end
  end


 private
    # Use callbacks to share common setup or constraints between actions.
    def set_product
      @product = Product.find(params[:id])

    end


    # Never trust parameters from the scary internet, only allow the white list through.
    def product_params
      params.require(:product).permit(:title, :description, :image, :price, :category_ids => [])
    end



    def search_params
      default_params = {}
      default_params.merge({user_id_eq: current_user.id}) if signed_in?
      # more logic here
      params[:q].merge(default_params)
    end  
end

0 个答案:

没有答案