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

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

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

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

Ruby on Rails

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

Q&A

1回答

2516閲覧

2つのテーブルに属するテーブルのレコードの作り方

KokiHirokawa

総合スコア48

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2017/03/05 16:08

編集2017/03/05 23:42

Userテーブル Productテーブル Commentテーブル
の3つのテーブルが存在し、以下のように構成しています。

models/user.rb

Ruby

1has_many :comments, dependent: :destroy

models/product.rb

Ruby

1has_many :comments, dependent: :destroy

models/comment.rb

Ruby

1belongs_to :user 2belongs_to :product

この時、コメントのレコードをどういった形で作るかについて分からないことがありました。


現在は、
controllers/products_controller.rb

Ruby

1def show 2 @product = Product.find(params[:id]) 3 @comment = current_user.comments.build 4end

views/products/show.html.erb

Ruby

1<%= form_for(@comment) do |f| %> 2 <%= f.hidden_field :product_id, value: @product.id %> 3 4 <div> 5 <%= f.text_area :comment %> 6 </div> 7 8 <div> 9 <%= f.submit "コメントする" %> 10 </div> 11<% end %>

といった感じで、 products/1 といったURLのパラメーターから product_id を取ってきて隠しデータとして送信する形で上手くいっているのですが、
他に推奨されている方法はありますでしょうか?

もし知っている方がいらっしゃるようでしたら、教えて頂きたいです。

追加

Ruby

1create_table "comments", force: :cascade do |t| 2 t.integer "user_id" 3 t.integer "idea_id" 4 t.text "comment" 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 t.index ["idea_id", "created_at"], name: "index_comments_on_idea_id_and_created_at" 8 t.index ["idea_id"], name: "index_comments_on_idea_id" 9 t.index ["user_id", "created_at"], name: "index_comments_on_user_id_and_created_at" 10 t.index ["user_id"], name: "index_comments_on_user_id" 11 end

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/03/05 22:28

テーブルの構造が不明だと回答できません。CREATE文を提示してください。
guest

回答1

0

railsの教科書では
accepts_nested_attributes_for

fields_for
を使います。

ruby

1has_many :comments, dependent: :destroy 2accepts_nested_attributes_for :comments 3

ruby

1has_many :comments, dependent: :destroy 2accepts_nested_attributes_for :comments

こうすると、fields_forを使って commentsだけでなくproductやuserの内容も同時に置き換えられます。

ruby

1<%= form_for(@product) do |f| %> 2 <%= f.hidden_field :product_id %> 3 <%= f.text_field :product_name %> 4~~ 5<%= f.fields_for :comments_attributes do |a|%> 6 <div> 7 <%= a.text_area :comment %> 8 </div> 9<% end %> 10 <div> 11 <%= f.submit "コメントごとproductを更新する" %> 12 </div> 13<% end %>

ただしこのままだとcommentデータがセキュリティで弾かれるので
controllers/products_controller.rb
にstrongparamater comments_attributes: を追加してください

ruby

1def product_params 2 params.require(:product).permit(:id,:name,~~,comments_attributes: [:id,:comment]) 3 end

ついでにgem nested_formやcocoonがあれば、コメントの複数追加や、削除も思いのままです。

さらに余力があれば、commentをつけたいモデルが増えた時も安心な
ポリモーフィックアソシエーションもオススメです。
Railsのポリモーフィックアソシエーション
これで、コメントをつけたい新しいモデルができるたびにtableにnew_model_idを追加しなくても大丈夫になります。

これが初心者にもわかりやすく推奨されている方法だと思います。

投稿2017/03/06 07:12

編集2017/03/06 07:13
moke

総合スコア2241

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

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

KokiHirokawa

2017/03/06 13:30

そのような便利なメソッドがあるのですね。 知らなかったです。 Ruby on Rails を体系的に学ぼうというサイトの、「複雑なフォームを作る」というところに詳しいことが書いてありました! ポリモーフィックアソシエーション?についても、貼っていただいたリンクで勉強してみようと思います。 ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問