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

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

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

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

Q&A

解決済

2回答

1608閲覧

データの取得方法、eachメソッドについて

lapi

総合スコア58

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/03/14 05:35

編集2017/03/14 06:00

###前提・実現したいこと
rails4 ローカル環境。

現在Pusherを使用し通知機能を実装しました。
通知機能自体は無事実装することができました。
teratailでいうと、ヘッダーのベルマークにお知らせのカウントが表示されるようにはできました。

そして、通知されたものを一覧ページで表示させたいと思ったのですが、一覧ページでのデータの取得方法が分かりません。

受け取るお知らせは「トピック」「タイムライン」の2つあり、どちらもNotificationモデルとアソシエーションしてあります。

現在記述しているコードはこちらです。

notifications_controller.rb

def index # 自分の通知のみ取得、通知は新しい順に並び替える。 @notifications = Notification.where(user_id: current_user.id).order(created_at: :desc) end

notifications/index.html.erb

html

1<h2>お知らせ</h2> 2 <% @notifications.each do |notification| %> 3 <p> 4 <%= notification.comment.user.try(:name) %>さんが 5 あなたの投稿(<%= link_to "#{notification.comment.topic.title}", topic_path(notification.comment.topic, notification_id: notification.id) %>)にコメントしました。 6 </p> 7 <p> 8 <%= notification.commenttl.user.try(:name) %>さんが 9 あなたの投稿(<%= link_to "#{notification.commenttl.timeline.content}", timeline_path(notification.commenttl.timeline, notification_id: notification.id) %>)にコメントしました。 10 </p> 11 <% end %>

###発生している問題・エラーメッセージ
現在のnotifications/index.html.erbでの記述では

ActionView::Template::Error (undefined method `user' for nil:NilClass):

とエラーになってしまいます。

トピックとタイムラインどちらかだけのデータなら取得して表示はできるのですが、どちらのお知らせも表示する方法が分かりません。

こういう場合はそもそもeachメソッドではなく違うメソッドを使ったりするのでしょうか?

説明が分かりづらい点もあるかとは思いますが、ご教授のほどよろしくお願いします。

###補足
notificationsテーブル

create_table "notifications", force: :cascade do |t| t.boolean "read", default: false t.integer "user_id" t.integer "comment_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "commenttl_id" end add_index "notifications", ["comment_id"], name: "index_notifications_on_comment_id", using: :btree add_index "notifications", ["commenttl_id"], name: "index_notifications_on_commenttl_id", using: :btree add_index "notifications", ["user_id"], name: "index_notifications_on_user_id", using: :btree

下記のようにトピック、あるいはタイムラインのみを取得すると、どちらかのデータは正常に表示はできます。
下記の場合はトピックに関するお知らせのみ表示されます。

notifications/index.html.erb

html

1<h2>お知らせ</h2> 2 <% @notifications.each do |notification| %> 3 <p> 4 <%= notification.comment.user.try(:name) %>さんが 5 あなたの投稿(<%= link_to "#{notification.comment.topic.title}", topic_path(notification.comment.topic, notification_id: notification.id) %>)にコメントしました。 6 </p> 7 <% end %>

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

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

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

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

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

guest

回答2

0

ベストアンサー

DB設計(Model定義)ミスかと思います。
とりあえず

html

1<h2>お知らせ</h2> 2 <% @notifications.each do |notification| %> 3 <%= (content_tag :p ,"#{notification.comment.user.try(:name)}さんが 4 あなたの投稿#{<%= (link_to notification.comment.topic.title, topic_path(notification.comment.topic, notification_id: notification.id)})にコメントしました。") if notification.comment.present? %> 5 <%= (content_tag :p ,"#{notification.commenttl.user.try(:name)}さんが 6 あなたの投稿(#{<%= (link_to notification.commenttl.timeline.content, timeline_path(notification.commenttl.timeline, notification_id: notification.id)})にコメントしました。") if notification.commenttl.present? %> 7 <% end %>

というふうにすれば、とりあえず思い通りの結果が表示されると思います。
あまりスマートではないですが。

もし必要なら、別質問を立て、各モデルを晒してくださればリファクタリングのお手伝いもできますが。。

投稿2017/03/14 06:04

編集2017/03/14 06:41
moke

総合スコア2241

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

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

lapi

2017/03/14 06:11

ご回答ありがとうございます。 確かにmokeさんのご指摘通り修正したら表示はできました。 お知らせがない場合は空の値で表示されてしまい思うようにはいきません。 別質問を立て、各モデルを記載させて頂きますので、ぜひリファクタリングのお手伝いして頂けると嬉しいです。 別質問立て終わりましたら、再度こちらでコメントさせて頂きます。
moke

2017/03/14 06:34 編集

一応レイアウトに関してはp tagをどうにかすればいいので 回答修正するので再度試してみてください
lapi

2017/03/14 06:39

回答修正までありがとうございます。 再度そちらでも試しています。 https://teratail.com/questions/69071?modal=q-comp こちらの方で新しく質問を立てましたので、お時間があるときに改めてご教授いただけると嬉しいです。 よろしくお願いします。
guest

0

userメソッドが定義されていないというエラーが出ています。
データベースの構造がわからないので具体的なことは何も言えないのですが、下記の部分が間違っているのではないでしょうか?

notification.comment.user

投稿2017/03/14 05:54

KaiShoya

総合スコア551

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

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

lapi

2017/03/14 06:05

ご回答ありがとうございます。 データベースのnotificationsテーブルに関して追記させて頂きました。 現状、トピックあるいはタイムラインのどちらかのみのお知らせを取得する場合は notification.comment.user で取得できるのですが、2つのお知らせを取得すると質問したようなエラーになってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問