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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

1983閲覧

個々の記事に対してコメントを関連づけて保存したい

NaojirouHisada

総合スコア60

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2016/01/05 08:19

現在Facebookのような機能をRailsで作成しています。
ユーザは複数の記事と複数のコメントを持ち、
複数の記事は一人のユーザに帰属し、コメントも1つの記事に帰属するという関係です。

ユーザモデル class User < ActiveRecord::Base has_one :member has_many :microposts has_many :comments has_secure_password accepts_nested_attributes_for :member end 記事モデル class Micropost < ActiveRecord::Base belongs_to :user has_many :comments end コメントモデル class Comment < ActiveRecord::Base belongs_to :micropost belongs_to :user end

現在、ユーザコントローラとコメントコントローラをこのように記述することで、
ユーザと記事に紐付いたコメントを作成することに成功しました。

*current_userはログイン中のユーザを表しています。

ユーザコントローラ class UsersController < ApplicationController def show @user = User.find(params[:id]) @micropost = Micropost.find(params[:id]) @microposts = @user.microposts @microposts.each do |micropost| @comment= micropost.comments.build @comment.user = current_user end end end コメントコントローラ class CommentsController < ApplicationController def create @microposts = current_user.microposts @comment = Comment.new(comment_params) @microposts.each do |micropost| @comment.micropost = micropost end @comment.user = current_user if @comment.save flash[:success] = "コメントしました。" redirect_to root_path else render 'static_pages/home' end end end

ですが、
どの記事にコメントしても、
最後の記事に紐付いたコメントを作成してしまいます。

INSERT INTO "comments" ("content", "micropost_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["content", "s"], ["micropost_id", 3], ["user_id", 1], ["created_at", "2016-01-05 08:14:59.920023"], ["updated_at", "2016-01-05 08:14:59.920023"]]

これを、
ユーザの記事1に対しては、

INSERT INTO "comments" ("content", "micropost_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["content", "s"], ["micropost_id", 1], ["user_id", 1], ["created_at", "2016-01-05 08:14:59.920023"], ["updated_at", "2016-01-05 08:14:59.920023"]]

ユーザの記事2に対しては

INSERT INTO "comments" ("content", "micropost_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["content", "s"], ["micropost_id", 2], ["user_id", 1], ["created_at", "2016-01-05 08:14:59.920023"], ["updated_at", "2016-01-05 08:14:59.920023"]]

のように個々の記事に紐付いたコメントを作成するためには、
どう修正すればよいのでしょうか?
お手数おかけしますが、
アドバイス宜しくお願いします。

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

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

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

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

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

guest

回答2

0

を参照するとよいです。

class Micropost < ActiveRecord::Base
has_many :comments
のような記述の追加が必要だということです。

上のページからの参照先
http://stackoverflow.com/questions/3732198/
に comment を新規登録する場合の ruby コード記載例があります。

@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
@comment.user = User.find(current_user.id)

こんな風に commtnt <--> post, comment <---> user の関連付けを構築していく必要があります。

投稿2016/01/05 15:31

katoy

総合スコア22324

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

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

NaojirouHisada

2016/01/06 09:17

katoyさん。 お忙しい中、アドバイスありがとうございます(^^) ``` 記事モデル class Micropost < ActiveRecord::Base belongs_to :user has_many :comments end ``` このように記事モデルに、 commentsを関連づけて、 コメントコントローラの def create Micropost.find(params[:micro post_id] ) ..... end と続けてみましたが、 マイクロポストのIDが見つかりませんというエラーがでました(^^;) 試しに、rails dbでデータベース内を確認しましたが、 IDは正常に発行されていました。 これは、 関連づけが正常に行われていないがためにエラーになったのでしょうか(^^;)??
katoy

2016/01/06 22:24

Micropost.find(params[:micro post_id] ) の実行成否は、関連づけの状態とは無関係と思います。 Micropost.find(params[:micro post_id] ) の実行前で break して、 Micropost.find(params[:micro post_id] ) を手作業で実行させてみてください。 params の内容も確認してみてください。 (break する方法がわからなければ、 params の内容を log に出しなどして確認をするとよいです) "rails pry" で web 検索すると、break のさせ方がわかると思います。
NaojirouHisada

2016/01/07 09:28

手作業で実行させてみた結果、 ``` [1] pry(#<CommentsController>)> Micropost.find(params[:micropost_id]) Micropost Load (7.2ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" = ? LIMIT 1 [["id", nil]] ActiveRecord::RecordNotFound: Couldn't find Micropost with 'id'= from /usr/local/rvm/gems/ruby-2.2.1/gems/activerecord-4.2.1/lib/active_record/core.rb:155:in `find' ``` このような結果がでました。 MicropostのIDが正常にコメントに引き渡されていないということでしょうか?(^^;)
guest

0

ベストアンサー

突っ込みたいところはいっぱいありますが・・・

CommentControllerのcreateで、commentをつけたいmicropostを特定できていないので、つけようがないでしょう。
書かれているソースでは、current_userのmicropostsをすべて取得した上で、ループで回して新規に作成したcommentに次々関連づけているので、当然、自分にひも付いているmicropostの最後のものが関連づけられます。

何らかの引数で関連づけたいmicropostのidを引き渡し、Micropost.findして関連づけてあげる必要があるでしょう。

投稿2016/01/05 12:02

rifuch

総合スコア1901

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

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

NaojirouHisada

2016/01/06 09:22

rifuchさんアドバイスありがとうございます。 コメントコントローラの def create内で、 micropostのidをMicropost.find(params[:micropost_id])で取得しようとしましたが、 Micropostのidがないというエラーが発生していましたが、そのためでしたか(^^;) 引き渡すのは、 コメント投稿時に、コメント内容と共に、 記事のIDも送信させるということでしょうか?? お手数おかけして申し訳ございません(^^;)
rifuch

2016/01/06 20:06

そうなりますね。普通の流れで行けば、comment投稿の対象となるmicropostが表示されているでしょうから、そのIDをパラメータに含めておくってあげれば良いかと思います。 また、showメソッドの中でのparams[:id]の扱いがおかしい(UserとMicropostを同じIDで検索している)ので、パラメータに何が入っているのか理解されていないのでは?と思った次第です。 このあたり、どのパラメータに何が入っているのか、きちんと意識して実装される事をお勧めします。
NaojirouHisada

2016/01/07 09:30

showの部分で、 Micropost.find(params[:micropost_id])と記述しても、 Couldn't find Micropost with 'id'=とエラーがでたので、 prams[:id]で行っていました(^^;) なるほど。 アドバイスありがとうございます。 一度意識してもう一度考えて行ってみます!!
rifuch

2016/01/07 10:00 編集

link_toメソッドやform系のメソッドでどんなURLが生成され、どんなパラメータが渡されているかをきちんと把握する必要がありそうですね。 Railsもバージョンが上がる毎に自動生成されるURLが便利になってゆき、逆に生成されるURLやパラメータがわかりにくくなっている気がします。 Railsガイドなんかを読みこんで、しっかり理解される事をお勧めします。 がんばってくださいね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問