質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails

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

Q&A

解決済

1回答

761閲覧

Rails form objectにて片方のテーブルに保存ができない

kenta34344

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2021/08/29 01:45

編集2021/08/30 03:42

前提・実現したいこと

商品登録とタグを登録したいです。タグを選択して登録するようにしたいですが、上手く行きません。

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

NoMethodError in StockItemsController#create undefined method `tag_word=' for #<Tag:0x00007f94bc43aaf0 @attributes={:tag_word=>"5"}>

該当のソースコード

newhtml

1<%= form_with model: @stock_item, url: stock_items_path, local: true do |f| %> 2 <div class="field"> 3 <%= f.label :stock_item_manufacturer, "メーカー名", class: :form_name %><br /> 4 <%= f.text_field :stock_item_manufacturer, class: :form_text, id:"item_manufacturer" %> 5 </div> 6 7 <div class="field"> 8 <%= f.label :stock_item_name, "商品名", class: :form_name %><br /> 9 <%= f.text_field :stock_item_name, class: :form_text, id:"new_item_name" %> 10 </div> 11 12 <div class="field"> 13 <%= f.label :stock_item_standard, "規格", class: :form_name %><br /> 14 <%= f.text_field :stock_item_standard, class: :form_text, id:"item_standard" %> 15 </div> 16 17 <div class="field"> 18 <%= f.label :stock_item_strage_condition, "保存方法", class: :form_name %><br /> 19 <%= f.text_field :stock_item_strage_condition, class: :form_text, id:"item_strage_condition" %> 20 </div> 21 22 <div class="field"> 23 <%= f.label :stock_item_description, "商品説明", class: :form_name %><br /> 24 <%= f.text_area :stock_item_description, class: :form__text, id:"item_description" %> 25 </div> 26 27 <div class="field"> 28 <%= f.label :tag_word, "タグ", class: :form_name %><br /> 29 <%= f.collection_select(:tag_word, Tag.all, :id, :name, {}, {class: :form__text, id:"item_description"}) %> 30 </div> 31 32 <div class="parallel"> 33 <div class="field"> 34 <%= f.label :image, "新商品の画像", class: :form_name %><br /> 35 <%= f.file_field :image, id:"item_image", class: :form_name %> 36 </div> 37 </div> 38 39 <div class="actions"> 40 <%= f.submit "保存する", class: :send, class: :form_name %> 41 </div> 42 <div id="image-list" ></div> 43 <% end %>

stockitemcontroller

1class StockItemsController < ApplicationController 2 3 def index 4 @stock_items = StockItem.all.order(created_at: :desc) 5 end 6 7 def new 8 @stock_item = ItemsTag.new 9 end 10 11 def create 12 @stock_item = ItemsTag.new(stock_item_params) 13 if @stock_item.save 14 return redirect_to root_path 15 else 16 render "new" 17 end 18 end 19 20 def edit 21 @stock_item = StockItem.find(params[:id]) 22 end 23 24 def update 25 if @stock_item.update(stock_item_params) 26 redirect_to contacts_path 27 else 28 render :edit 29 end 30 end 31 32 def destroy 33 @stock_item = StockItem.find(params[:id]) 34 if @stock_item.destroy 35 redirect_to root_path 36 else 37 render :index 38 end 39 end 40 41 private 42 43 def stock_item_params 44 params.require(:items_tag).permit(:stock_item_manufacturer, :stock_item_name, :stock_item_standard, :stock_item_strage_condition, :stock_item_description, :image, :tag_word) 45 end 46 47end

stockitemrb

1class StockItem < ApplicationRecord 2 3 has_many :item_connects, dependent: :destroy 4 has_one_attached :image 5 6 extend ActiveHash::Associations::ActiveRecordExtensions 7 has_many :tags, through: :item_connects 8end

tagrb

1class Tag < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '--' }, 4 { id: 2, name: '和食' }, 5 { id: 3, name: '洋食' }, 6 { id: 4, name: '中華' }, 7 { id: 5, name: '揚げ' }, 8 { id: 6, name: '炒め' }, 9 { id: 7, name: '湯せん' }, 10 { id: 8, name: '焼き' }, 11 { id: 9, name: '蒸し' }, 12 { id: 10, name: '自然解凍' }, 13 { id: 11, name: '鍋' }, 14 { id: 12, name: '牛' }, 15 { id: 13, name: '豚' }, 16 { id: 14, name: '鶏' }, 17 { id: 15, name: '海鮮' }, 18 { id: 16, name: '山菜' }, 19 { id: 17, name: '野菜' }, 20 { id: 18, name: 'ラーメン' }, 21 { id: 19, name: 'うどん' }, 22 { id: 20, name: 'そば' }, 23 { id: 21, name: 'パスタ' }, 24 { id: 22, name: 'パン' }, 25 { id: 23, name: 'ご飯' }, 26 { id: 24, name: 'パン' }, 27 { id: 25, name: '丼' }, 28 { id: 26, name: 'オードブル' }, 29 { id: 27, name: '弁当' }, 30 { id: 28, name: '副菜' }, 31 { id: 29, name: '先付' }, 32 { id: 30, name: '椀種' }, 33 { id: 31, name: '八寸' }, 34 { id: 32, name: 'お子様' }, 35 { id: 33, name: 'スイーツ' }, 36 { id: 34, name: '洋菓子' }, 37 { id: 35, name: '和菓子' }, 38 { id: 36, name: '調味料' }, 39 { id: 37, name: 'ドレッシング' }, 40 { id: 38, name: 'タレ' }, 41 { id: 39, name: '乾物' }, 42 ] 43 44 include ActiveHash::Associations 45 has_many :item_connects 46 has_many :stock_items, through: :item_connects 47 48end 49
class ItemConnect < ApplicationRecord belongs_to :stock_item extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :tag end

試したこと

アソシエーションの確認は問題なかったです。tag.rbの情報をcollection_selectにて運びたいですが、ここがうまく繋げてないんじゃないかと思います。
よろしくお願いします。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

newhtml の以下の部分で、Tag のオブジェクトに対して tag_word を呼び出しているけど、
そんなメソッドはないのでエラーになってるように見えます。

<%= f.collection_select(:tag_word, Tag.all, :id, :name, {}, {class: :form__text, id:"item_description"}) %>

第一引数の :tag_word を :id か :name に変更してみてください。

f.collection_select を使ってみた

投稿2021/08/31 02:27

neko_daisuki

総合スコア2090

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

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

kenta34344

2021/08/31 10:45

NoMethodError in StockItemsController#create 回答ありがとうございます。 :id :nameと共に試しましたが、エラーは変わりませんでした。 NoMethodErrorですので、コントローラーの記述も怪しいでしょうか?
neko_daisuki

2021/08/31 11:03

エラーに行番号が含まれていませんか?
kenta34344

2021/08/31 11:10

すみません。 含まれてます。 21 Tag.create(tag_word: tag_word) です。
neko_daisuki

2021/08/31 11:27

提示されたコードの中にはそこが含まれてないみたいです。追記をお願いします。 また、エラー画面をスクショでいいのであれば助かります。
neko_daisuki

2021/08/31 11:41

items_tag.rb の中の save でエラーが起きてるみたいですね。 たぶん、tags テーブルに tag_word というカラムがないんじゃないでしょうか。
neko_daisuki

2021/08/31 12:03

コントローラーから呼び出されている ItemsTag がおかしいようです。 クラス Tag は ActiveHash::Base を継承しています。ActiveHash はデータベースと関係ないです。 そして、Tag の中で定義したデータの中に tag_word がないのでエラーになってるようです。 (ActiveHashでcreateしてもrailsを再起動するとcreateしたデータは消えるっぽいです) 解決策は、 1. ActiveHash::Base を継承する Tag を別の名前にする 2. ActiveHash を使うのをやめてデータは seeds.rb でデータベースに作成する
kenta34344

2021/08/31 12:16

ありがとうございます。 Tagを別の名前にしてやってみます。
kenta34344

2021/09/04 06:14

Tagとは別にGenre.rbを作成しcorection_selectのリストを移したら保存できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問