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

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

詳細はこちら
Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

841閲覧

ruby on rails モデルの情報を他のモデルに追加する方法について

Angelica.87

総合スコア9

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/02/21 04:44

前提・実現したいこと

ruby on rails を使って買い物をする前にメモとして確認できるようなWebアプリを作成したい。

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

Fruitモデルで保存したデータを他のモデルであるNoteモデルに追加することが出来ない。そもそも試したやり方が正しいのかも不明。

該当のソースコード

ソースコード

試したこと

ruby on rails 入門書を読み込んで自作アプリの制作中です。
Fruitモデルとfruitsコントローラを作成して以下のような画面の状態までは作ることが出来ました。
イメージ説明
food項目にある商品をクリックするとshowアクションが実行され、EditとDeleteも問題なく実行することが出来ます。
実現したいことは、ここにあるaddの項目をクリックすると、別のモデルであるNoteモデルに追加する機能を実装したいと思っています。
イメージ説明
参考にFruitモデルとfruitsコントローラのコードを以下に載せます。

ruby

1#xxx_create_fruits.rb 2 3class CreateFruits < ActiveRecord::Migration[6.0] 4 def change 5 create_table :fruits do |t| 6 t.integer :food_id 7 t.text :food 8 t.integer :price 9 t.text :number 10 t.text :message 11 12 t.timestamps 13 end 14 end 15end 16

ruby

1#fruits_controller.rb 2 3class FruitsController < ApplicationController 4 def index 5 @msg = 'Fruit data.' 6 @data = Fruit.all 7 end 8 9 def show 10 @msg = "Index data." 11 @fruit = Fruit.find(params[:id]) 12 end 13 14 def add 15 @msg = "Index data." 16 @fruit = Fruit.new 17 end 18 19 20 def create 21 @fruit = Fruit.new fruit_params 22 if @fruit.save then 23 redirect_to '/fruits' 24 else 25 render 'add' 26 end 27 end 28 29 def edit 30 @msg = "edit data.[id = " + params[:id] + "]" 31 @fruit = Fruit.find(params[:id]) 32 end 33 34 def update 35 @fruit = Fruit.find(params[:id]) 36 if @fruit.update(fruit_params) then 37 redirect_to '/fruits' 38 else 39 render 'edit' 40 end 41 end 42 43 def delete 44 obj = Fruit.find(params[:id]) 45 obj.destroy 46 redirect_to '/fruits' 47 end 48 49 private 50 def fruit_params 51 params.require(:fruit).permit(:food_id,:food,:price,:number,:message) 52 end 53 54end 55

Noteモデルとnotesコントローラーのコードは以下のとおりです。

ruby

1#xxx_create_notes.rb 2 3class CreateNotes < ActiveRecord::Migration[6.0] 4 def change 5 create_table :notes do |t| 6 t.integer :shopping_id 7 t.text :product 8 t.integer :price 9 t.text :number 10 t.text :message 11 12 t.timestamps 13 end 14 end 15end 16

ruby

1#notes_controller.rb 2 3class NotesController < ApplicationController 4 def index 5 end 6 7 def show 8 end 9end 10

以上の状態でどこに、どのようなコードを記載すれば実現できるのか、もしくはそもそもモデルの情報を他のモデルに追加することは出来ないのか、その辺を踏まえてご教授いただければと思います。よろしくお願いします。

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

windows 10

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

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

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

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

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

winterboum

2021/02/21 08:54

「Fruitモデルで保存したデータを他のモデルであるNoteモデルに追加する」という意味がわかりません。 2つのモデルの項目は完全に一致ではないですので、データのcopyではないですね。
Angelica.87

2021/02/21 09:11

2つのモデルの項目は違います。 「Fruitモデルで保存したデータを他のモデルであるNoteモデルに追加する」という意味ですが、 例えばFruitモデルにはシャインマスカットというデータがあって、これをNoteモデルに追加することが出来ないかという意味です。
winterboum

2021/02/21 09:45

自然言語だと分かりにくいです。 Fruitモデル の例 とそれを Noteモデルの追加 したときどうなりたいのか を データの形で示してください。
Angelica.87

2021/02/21 09:54

すみません。データの形で示すとはどのようにしたら良いのでしょうか?
winterboum

2021/02/21 09:58

fruit = Fruit.create(food_id: 1, food: 'フード', price: 300, number: 10. message: 'おいしいよ') というデータがあるとき、Noteにどういうデータを作るのか
Angelica.87

2021/02/21 10:07

Note(shopping_id:1,product:'フード',price: 300, number:10.message:'おいしいよ')というデータを作りたいです。
guest

回答1

0

ベストアンサー

fruit = Fruit.create(food_id: 1, food: 'フード', price: 300, number: 10. message: 'おいしいよ')
から
Note(shopping_id:1,product:'フード',price: 300, number:10.message:'おいしいよ')
を作るのでしたら、そのままです
Note.create(shopping_id: fruit.food_id, product: fruit.food, price: fruit.price, number: fruit.number. message: fruit.message)
としてください。
項目が増えてきたらずらずら書くのも厄介なので
attributes = fruit.attributes attributes.transform_keys! {|k| case k when :food_id; shopping_id when :food ; :product else ; k} Note.create(attributes)
とも出来ますが。
こういう場合は項目名は一致させておくのが良いです

投稿2021/02/21 10:20

編集2021/02/23 00:55
winterboum

総合スコア23567

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

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

Angelica.87

2021/02/21 19:58

私の聞き方が悪くて大変申し訳ないのですが、@fruit = Fruit.find(params[:id])で取得した@fruitをNoteモデルに追加する方法を教えていただけないでしょうか?
winterboum

2021/02/21 22:49

「そのままです」から下を そのまま。 fruit を @fruit に直す必要がありますが。
Angelica.87

2021/02/22 21:40

def note @fruit = Fruit.find(params[:id]) Note.create(shopping_id:@fruit.food_id,product:@fruit.food,price:@fruit.price,number:@fruit.number,message:@fruit.message) attributes = @fruit.attributes attributes.transform_keys! {|k| case k when:food_id;:shopping_id when:food;:product else;k end} Note.create(attributes) redirect_to '/notes' end これで実行したところ、FruitsController#noteのActiveModel :: UnknownAttributeError Noteの不明な属性 'food_id'。 Note.create(属性) というエラーが出てしまったのですが、どこに原因があるか分かれば教えていただきたいです。
winterboum

2021/02/23 01:00

ごめん、回答の書き方がよくなかったので混乱させてますね。 2つの書き方を並べてます。回答修正しました。 で、 エラーの原因ですがその情報だと分かりにくいです。 エラーメッセージを編集すると大事な情報が落ちることがあるのでそのまま載せてください。どのfileの何行目とかも有るはずなので。 例えば FruitsController#note と書いてますが、それは FruitsController の note メソッド と読みます。でもそんなの無いですよね。
Angelica.87

2021/02/23 01:48

FruitsContrpllerにはnoteメソッドを入れています。 上のやり方でやったところNoteモデルに追加することが出来ました。 しかし、下のやり方でやったところエラーが出てしまいました。コードとエラー内容は以下のとおりです。 コード def note @fruit = Fruit.find(params[:id]) attributes = @fruit.attributes attributes.transform_keys!{|k| case k when:food_id;:shopping_id when:food;:product else;k end} Note.create(attributes) redirect_to '/notes' end エラー内容 FruitsController#noteのActiveModel :: UnknownAttributeError Noteの不明な属性 'food_id'。 抽出されたソース(行#56周辺): 54 else; k 55 終わり} 56 Note.create(属性) 57 redirect_to '/ notes' 58 終わり 59 Rails.root: C:/Users/****/Desktop/RailsApp アプリケーショントレース| フレームワークトレース| フルトレース app/controllers/fruits_controller.rb:56:in `note' リクエスト パラメータ: {"id" => "4"} セッションダンプを切り替えます 環境ダンプを切り替えます 応答 ヘッダー: なし 本当に初心者で度重なる質問、申し訳ありません。ご教示お願いします。
winterboum

2021/02/23 03:52

そのエラーメッセージって翻訳が入ってますね、かえって分かりにくい。 翻訳止められません? で、 もしかすると attributesのkeyがsymbolでなくstringなのかも。 case --end の間の symbol を Stringになおしてみてください。 例えば :food_id を "food_id" に
Angelica.87

2021/02/23 05:09

def note @fruit = Fruit.find(params[:id]) attributes = @fruit.attributes attributes.transform_keys!{|k| case k when:"food_id";:"shopping_id" when:"food";:"product" else;k end} Note.create(attributes) redirect_to '/notes' end これで試すと以下のエラーが出ます。 ActiveModel::UnknownAttributeError in FruitsController#note unknown attribute 'food_id' for Note. Extracted source (around line #56): 54 55 56 57 58 59 else;k end} Note.create(attributes) redirect_to '/notes' end Rails.root: C:/Users/****/Desktop/RailsApp Application Trace | Framework Trace | Full Trace app/controllers/fruits_controller.rb:56:in `note' Request Parameters: {"id"=>"3"} Toggle session dump Toggle env dump Response Headers: None
Angelica.87

2021/02/23 05:13

すみません。ご指導のあったように:food_id を "food_id"に変えてやったら無事にいきました。 親切に対応いただきありがとうございました。 引き続き自作アプリを作成していきたいと思います。
Angelica.87

2021/02/23 05:29

ちなみになんですが、一度目は通常に処理が出来たのですが、二度目はエラーが出ました。下記のようなものなのですが、どのようにしたら解決できるか教えていただけないでしょうか? ActiveRecord::RecordNotUnique in FruitsController#note SQLite3::ConstraintException: UNIQUE constraint failed: notes.id Extracted source (around line #56): 54 else;k 55 end} 56 Note.create(attributes) 57 redirect_to '/notes' 58 end 59 Rails.root: C:/Users/****/Desktop/RailsApp Application Trace | Framework Trace | Full Trace app/controllers/fruits_controller.rb:56:in `note' Exception Causes SQLite3::ConstraintException: UNIQUE constraint failed: notes.id Request Parameters: {"id"=>"1"} Toggle session dump Toggle env dump Response Headers:
winterboum

2021/02/23 08:03

ActiveRecord::RecordNotUnique ですから同じデータだと行けないというのに引っかかってますね。 ああ、、、、 attributesから id を取り除かないとだめですね。 attributes = @fruit.attributes のあとに attributes.delete("id") してください
Angelica.87

2021/02/24 20:10

ご指導いただいたやり方でやったところ、無事に出来ました。 長時間の対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問