#前提
()はカラムです。
booksテーブル(name, price, author, image, user_id)
categoriesテーブル(name)
book_categoriesテーブル(book_id, category_id) ◀︎ 中間テーブル
#実現したいこと
投稿機能を実装できるようにしたい
#エラーメッセージ
NoMethodError in BooksController#create undefined method `category_id' for #<Book:0x00007fe0616824e8> Did you mean? category_ids category_ids= Extracted source (around line #14): def create Book.create(book_params) if Book.create redirect_to root_path else
#該当のソースコード
books_controller.rb
class BooksController < ApplicationController before_action :move_to_index, except: [:index, :show] before_action :set_book, only: [:edit, :show] def index @books = Book.all.order(created_at: :DESC) end def new @book = Book.new end def create ActiveRecord::Base.transaction do book = Book.create!(book_params) BookCategory.create!(book: book, category_id: params[:category]) end redirect_to root_path rescue ActiveRecord::RecordInvalid => e render :new end def destroy book = Book.find(params[:id]) book.destroy if !book.save redirect_to root_path end end def show end def edit end def update book = Book.find(params[:id]) book.update(book_params) if book.save redirect_to book_path(book.id) else render :index end end private def book_params params .require(:book).permit(:name, :price, :author, :image) .merge(user_id: current_user.id) end def set_book @book = Book.find(params[:id]) end def move_to_index unless user_signed_in? redirect_to action: :index end end end
new.html.haml
投稿する画面のviewです。
関係あるかわかりませんが載せておきます。
%header = render partial: 'header2.html.haml' %p.title 登録 .save .item = form_with model: @book, local: true do |f| %ul.contents %li.content .image 表紙 = f.text_field :image, placeholder: "画像URL", required: "", class: "default" %li.content = f.label :category, "カテゴリー" = f.collection_select :category, Category.all, :id, :name, include_blank: "カテゴリを選択してください" %li.content .name 本の名前 = f.text_field :name, placeholder: "例)ワンピース", required: "", class: "default" %li.content .author 著者 = f.text_field :author, placeholder: "例)尾田栄一郎", required: "", class: "default" %li.content .price 値段(税込み) = f.text_field :price, placeholder: "例)500", required: "", class: "default" %em 円 .btn = f.submit "登録", class: "btn-newBook" %footer = render partial: 'footer.html.haml'
book.rb
class Book < ApplicationRecord validates :name, presence: true validates :price, presence: true validates :image, presence: true validates :author, presence: true belongs_to :user has_many :categories has_many :categories, through: :books_categories end
category.rb
class Category < ApplicationRecord validates :name, presence: true has_many :books has_many :books, through: :books_categories end
book_category.rb
class BookCategory < ApplicationRecord validates :book_id, presence: true validates :category_id, presence: true belongs_to :book belongs_to :category end
user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end
application_record.rb
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end
#自分で調べたことや試したこと
・ 下記category_idの記述の仕方が違うと判断し、検索して出てきた記述を書いてみたが全て違った
params.require(:book).permit(:name, :price, :author, :image, :user_id, { category_id: [] })
・ booksテーブルにcategory_idカラムを追加しbooks_controllerの privateのpermitの()の中にcategory_idを追加すると投稿機能は実装できるが、book_categoriesテーブルには何も反映されない。
・ user_idをpermitの()の中に記述しているがbinbing.pryで確認したところuser_idが記述されていない為これも関係しているのか
49: def book_params
50: binding.pry
51: params.require(:book).permit(:name, :price, :author, :image, :user_id, { category_id: [] })
[1] pry(#<BooksController>)> params.require(:book).permit(:name, :price, :author, :image, :user_id, { category_id: [] })
Unpermitted parameter: :category
=> <ActionController::Parameters {"name"=>"ロマンチカクロック2", "price"=>"500", "author"=>"槙ようこ", "image"=>"https://dosbg3xlm0x1t.cloudfront.net/images/items/9784088672724/1200/9784088672724.jpg"} permitted: true>
解決法がわかる方がいらっしゃいましたら教えていただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/05 10:36 編集
2020/09/05 10:38
2020/09/05 10:42
2020/09/05 10:47
2020/09/05 10:51
2020/09/05 11:05 編集
2020/09/05 12:02
2020/09/05 12:05
2020/09/05 12:13 編集
2020/09/05 12:22
2020/09/05 13:00
2020/09/05 13:02
2020/09/06 09:31