2015-11-20 3 views
0

У меня есть товары и книги. Я пытаюсь соединить Книги к продукту с collection_selectcollection_select с несколькими моделями рельсов 4

Вот часть моей формы продукта:

<%= f.label :book_id %><br> 
    <%= f.collection_select(:book_id, Book.all, :id, :title, {}, multiple: :true) %> 

Book Модель: Модель

class Book < ActiveRecord::Base 
belongs_to :product 
end 

продукта:

class Product < ActiveRecord::Base 
has_many :books 
end 

Миграции:

class AddBookToProducts < ActiveRecord::Migration 
def change 
    add_column :products, :book_id, :integer 
    add_index :products, :book_id 
end 
end 

class AddProductToBooks < ActiveRecord::Migration 
def change 
    add_column :books, :product_id, :string 
    add_index :books, :product_id 
end 
end 

BooksController:

def new 
@book = Book.new 
authorize @book 
end 

def create 
@book = Book.new(book_params) 
@book.user = current_user 
... 

ProductsController:

 class ProductsController < ApplicationController 
      require "stripe" 
      before_action :set_product, only: [:show, :edit, :update, :destroy] 

      # GET /products 
      # GET /products.json 
      def index 
      @products = Product.all.page params[:page] 
      authorize @products 

      end 

      # GET /products/1 
      # GET /products/1.json 
      def show 

      @stripe_btn_data = { 
      key: "#{ Rails.configuration.stripe[:publishable_key] }", 
      description: @product.title, 
      amount: (@product.price * 100), 
      }  


      authorize @product 
      end 

      # GET /products/new 
      def new 
      @product = Product.new 
      @books = Book.all 
      authorize @product 
      end 

      # GET /products/1/edit 
      def edit 
      authorize @product 
      end 

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

      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 
      authorize @product 
      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 
      authorize @product 
      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, :body, :price, :active, :state, :hardcopy_book, :online_only, :online_hardcopy, :expiration, :monthly, :annual, :user_id, :book, :book_id, :id) 
      end 
     end 

Параметры показывают: book_id но не вставляет book_id в продукты.

Вот как я показываю выбранные книги по продукту/показать

<strong>Book:</strong> 
    <ul> 
    <% @product.books.each do |book| %> 
    <li><%= link_to book.tile, (book) %><li> 
    <% end %> 
    </ul> 

Что мне не хватает?

+0

что ваш способ подключения книг к продукту? –

+0

Я хочу, чтобы у продукта были определенные книги – jgrant

+0

Итак, вы хотите присвоить книги категории, когда уже созданы книги и категории? –

ответ

1

Во-первых, ваша миграция не так, нам нужно только одну миграцию и здесь:

class AddBookToProducts < ActiveRecord::Migration 
def change 
    add_column :books, :product_id, :string 
    add_index :books, :product_id 
end 
end 

Потому что книга принадлежит к продукту и продукт имеет много Книга поэтому добавьте на одну колонку product_id для книг таблицы достаточно.

Во-вторых, изменить форму продукта, чтобы: (пожалуйста, обратите внимание на изменения от book_id к book_ids)

<%= f.label :book_id %><br> 
<%= f.collection_select(:book_ids, Book.all, :id, :title, {}, multiple: :true) %> 

Затем добавьте book_ids к Strong параметра в ProductsController

def product_params 
    params.require(:product).permit(:title, :body, :price, :active, :state, :hardcopy_book, :online_only, :online_hardcopy, :expiration, :monthly, :annual, :user_id, :book, :id, :book_ids => []) 
end 
+0

Я отрегулирую, спасибо. Я только что добавил продукты контроллера – jgrant

+0

@JustinGrant ответ обновлен, проверьте это! –

+0

Отлично! Большое спасибо @LongNguyen – jgrant