🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1707閲覧

多対多でのidの渡し方がわからない

motoki6318

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/03/16 08:08

前提・実現したいこと

キャンプの記録をするアプリを製作中です。
アイテムとキャンプは多対多の関係です。
キャンプとタグが多対多の関係です。
アイテムの保存とキャンプの保存のについては別で行っています。
キャンプとタグについては同時に作成するために、Fromオブジェクトを使用しています。
キャンプ記録作成の際持って行ったアイテムについてもキャンプ記録と関連付けしたいのですがこれがうまくいきません。
タグの複数生成は成功しています。
Fromオブジェクトでの保存は叶わないでしょうか?

発生している問題・エラーメッセージ

unknown attribute 'item_ids' for CampItemRelation. Rails.root: /Users/motokikeisuke/projects/camp-style Application Trace | Framework Trace | Full Trace app/models/camp_tags.rb:14:in `save' app/controllers/camps_controller.rb:16:in `create' Request Parameters: {"authenticity_token"=>"+7q9Qu0j96UOyfdlBnQJx9W9jE0nz9d3XlLOht7qlJvf+D1gp08phguhjP+s6hO02DiBcC6IGwZ1Gm5XqZZieQ==", "camp_tags"=>{"title"=>"test6", "style"=>"test1 test2", "item_ids"=>["1", "2"]}, "commit"=>"Send"}

該当のソースコード

campscontroller

1class CampsController < ApplicationController 2 before_action :authenticate_user!, except: [:index, :show] 3 before_action :set_item, only: [:index, :new, :show, :create] 4 def index 5 @tags = Tag.all 6 end 7 8 def new 9 @camp = CampTags.new 10 end 11 12 def create 13 @camp = CampTags.new(camp_params) 14 if @camp.valid? 15 @tag_list = camp_params[:style].split(/[[:blank:]]+/).select(&:present?) 16 @camp.save(@tag_list) 17 binding.pry 18 @item_ids = @camp.item_ids 19 CampItemRelation.create(camp_id: @camp.id, item_ids: @item_ids) 20 return redirect_to root_path 21 else 22 render "new" 23 end 24 end 25 26 private 27 28 def camp_params 29 params.require(:camp_tags).permit(:title, :style, item_ids: []).merge(user_id: current_user.id) 30 end 31 32 def set_item 33 if user_signed_in? 34 user = User.find(current_user.id) 35 @items = user.items 36 end 37 end 38 39end

campTagsrb

1class CampTags 2 3 include ActiveModel::Model 4 attr_accessor :title, :style, :user_id, :item_ids 5 6 with_options presence: true do 7 validates :title 8 validates :style 9 end 10 11 def save(tag_list) 12 @camp = Camp.create(user_id: user_id, title: title) 13 @item_ids = @camp.item_ids 14 CampItemRelation.create(camp_id: @camp.id, item_ids: @item_ids) 15 16 tag_list.each do |tag| 17 unless Tag.find_by(style: tag) 18 @tag = Tag.create(style: tag) 19 CampTagRelation.create(camp_id: @camp.id, tag_id: @tag.id) 20 else 21 @tag_id = Tag.find_by(style: tag) 22 CampTagRelation.create(camp_id: @camp.id, tag_id: @tag_id.id) 23 end 24 end 25 end 26 27end 28

newhtmlerb

1<div class="wrapper"> 2 <div class="side-ber"> 3 <%= render "side_ber" %> 4 </div> 5 <%= form_with model: @camp, url: camps_path, class:'form-wrap', local: true do |f| %> 6 <div class='form'> 7 <div class="title-field"> 8 <%= f.label :title, "キャンプタイトル" %> 9 <%= f.text_area :title, class:"input-title" %> 10 </div> 11 <div class="tag-field", id='tag-field'> 12 <%= f.label :style, "キャンプスタイル" %> 13 <%= f.text_field :style, class:"input-tag" %> 14 </div> 15 16 <p>使用アイテムを選択 </p> 17 <select name="camp_tags[item_ids][]" multiple> 18 <% @items.each do |item| %> 19 <option value=<%= item.id %>><%= item.name %></option> 20 <% end %> 21 </select> 22 23 24 </div> 25 <div class="submit-post"> 26 <%= f.submit "Send", class: "submit-btn" %> 27 </div> 28 <% end %> 29</div> 30

itemmodel

1class Item < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to :genre 4 belongs_to :user 5 has_many :camp_item_relations 6 has_many :camps, through: :camp_item_relations 7 8 9 with_options presence: true do 10 validates :genre_id, numericality: { other_than: 1, message: 'Select'} 11 validates :name 12 validates :feature 13 validates :price, numericality: { with: /\A[0-9]+\z/, message: 'Half-width number' } 14 end 15 16end

campitemrelation

1class CampItemRelation < ApplicationRecord 2 belongs_to :camp 3 belongs_to :item 4end

campmodel

1class Camp < ApplicationRecord 2 belongs_to :user 3 has_many :camp_tag_relations 4 has_many :tags, through: :camp_tag_relations 5 has_many :camp_item_relations 6 has_many :items, through: :camp_item_relations 7 8 validates :title, presence: true 9 10end

試したこと

paramsは
"camp_tags"=>{"title"=>"テストタイトル", "style"=>"ソロキャンプ", "item_ids"=>["1", "2"]}, "commit"=>"Send"}となっていました。
idの渡し方がわからないです。

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「親子モデル」「同時作成」などのキーワードで検索すると、似たようなことができる対処法が掲載されていることが確認できると思います。

例えば以下のような記事です。

accepts_nested_attributes_forで親子孫関係のレコードを同時作成する方法【実装例・rspecあり】

それらの記事を試してみると、質問したい内容が変わってくると思います。


CampItemRelationを作成することにはならないのではないかと思っていますが、どうしても作成したい時は、CampItemRelation.create(camp_id: @camp.id, item_id: @item_id)こうするしかないです。

以下のように書いていては動かないです。
CampItemRelation.create(camp_id: @camp.id, item_ids: @item_ids)

CampItemRelationには、item_idsというカラムが存在しないからです。

投稿2021/03/16 12:57

編集2021/03/16 12:59
siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問