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

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

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

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

Q&A

2回答

3916閲覧

rails ブログアプリ コメントした人の名前を表示したい

kiyo1005

総合スコア14

Ruby on Rails

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

0グッド

0クリップ

投稿2016/06/27 15:47

編集2016/06/27 18:18

お世話になります。
現在railsのアプリで投稿機能を実装しました。
teratailの質問機能と同じような、質問をして、他のユーザーがコメントするというごく一般的な投稿機能です。

投稿機能、コメント機能自体は完成したのですが、**「コメントを投稿した人の名前を表示する方法」**がわからず、今回質問させていただきます。

イメージ説明

イメージとしては、写真のようなイメージです。

Viewテンプレート

※user_id はCommentモデルのUserモデルを関連付けするためのカラム

#1 投稿させたコメントをループで取得 <% @post.comments.each do |com| %> <p><%= com.comment%></p> #コメント表示 <div class="comenter"> #2 コメントのid (com.user_id)でユーザーidと一致させてユーザーを取得しようと試みる <% user = @user.find_by_id(com.user_id) %> #3 ユーザー名 | 日付 を表示したい <%= user.name %> | <%= com.created_at.to_formatted_s(:without_second)%> </div> <% end %>

このソースではエラーになります
結論から述べますと、**「#2のところでコメントのuser_idが取得できていないから」**だと思っています

自分の試してみたことですが


1. #2でfind_by_id(2)のように、直接、数字で指定してあげると#3でユーザー名が表示される(エラーなし)

2.#3で<%= user.name %> → <%= com.user_id %>と書いてみると、コメントした人のid(数字)が表示される(エラーなし)
→ com.user_id と コメントしたユーザーのidは一致している

2.コメントを投稿した人ではなく、記事を投稿した人(teratailでいう、質問する側)のユーザーは表示できる
(idはparams[:id]で取得しました=urlから取得)

3.データベースを確認すると、has_many ,belongs_toはできていて、該当するコメントのuser_idとコメントを投稿した人のidは一致している


なので**「#2でuser_idが取得できていないことが原因」**だと考えています

つまり#2の部分で、user_idを取得し、Userモデルのコメントしたユーザーを一致させ、1つのユーザー情報を特定する処理ができれば <%= user.name %>という形でユーザー名を表示させることができると思います。

この場合、user_idを取得する方法はどのような方法になるのでしょうか。

文章がわかりにくいかもしれませんが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

最近、teratail に登録したので今頃の回答で恐縮ですが、User モデルの取扱を混乱されているように思います。
元のコードで

ruby

1user = @user.find_by_id(com.user_id)

としているところを

ruby

1user = User.find(com.user_id)

とすれば良さそうですが、コレではだめでしたか? そもそもリレーションが張られていれば

ruby

1user = com.user

でも良さそうですが…

投稿2016/11/03 02:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

自己解決しました。

解決方法は、Commentモデルに、コメントを送信した人の[名前][画像]を格納するカラムを追加し、コメントを送信する際にはhidden_fieldを使って[名前]current_user.nameと[画像]current_user.picを送信することにしました。

● コメント送信フォーム

<p> <%=f.label :comment %><br> <%= f.text_field :comment %> <%= f.hidden_field :name, :value => @user.name %> <%= f.hidden_field :pic, :value => @user.pic%> </p> <p> <%= f.submit "送信", class: "com-box"%> </p> <% end %>

● コメント表示

<% @post.comments.each do |com| %> <div class="comenter"> <p><%= com.comment%></p> <div class="line"> <%= com.name %> <%= com.created_at.to_formatted_s(:without_second)%></div> </div> <% end %>

実現したいことは実現できたのですが、この方法だと他のデータベースのカラムと重複してしまうので、なにか自分としてはすっきりしません。

いい方法がないか勉強します。

質問に目を通していただいたみなさま、ありがとうございました。

投稿2016/06/28 02:26

kiyo1005

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問