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

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

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

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

Ruby

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

Q&A

解決済

1回答

276閲覧

Rails チュートリアル 機能拡張(メッセージ機能)について

messy1019

総合スコア18

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/07/29 22:26

編集2018/07/30 10:12

railsチュートリアルを終えて、下記を参考にメッセージ機能を追加しようとしました。

https://qiita.com/YN6127yn/items/7ddd966141cca195b4da

しかし、メッセージのデータがないのでメッセージが出力されないのは分かるのですが、<div class="message_form">で定義されるメッセージフォームもapp/views/users/show.html.erbに出力されません。

<aside class="col-md-4"> <!-- 省略 --> <% if !current_user?(@user) && logged_in? %> <section class="message_box"> <div id="messages"> <%= render @messages %> </div> </section> <script type="text/javascript"> var height = 0; $("div.message").each( function() { height += ($(this).height()); }); $('section.message_box').scrollTop(height); </script> <div class="message_form"> <%= render 'messages/message_form', {from_user: current_user, to_user: @user, room_id: @room_id} %> </div> <% end %> </aside>

<% if !current_user?(@user) && logged_in? %>の箇所のif文が気になっています。
カレントユーザーではない、かつログインしていると読み取れてしまします。もしそうであれば他人じゃなければ上記viewが出力されなくなってしまいます。

出力する検証をするため、<% if !current_user?(@user) && logged_in? %>の箇所の!を取ったり、!current_user?(@user) &&ごと削除すると、下記エラーが発生してしまいます。

undefined method `identifier' for nil:NilClass

実際は、viewに何も出力されていないのですが原因が分かりません。

コントローラーで影響がありそうなコードも記載いたします。
●users.controller.rb

def messages @user = User.find(params[:id]) @room_id = message_room_id(current_user, @user) @messages = Message.recent_in_room(@room_id) end

モデルで影響のありそうなコードを記載済ます。
●models/message.rb

def Message.recent_in_room(room_id) where(room_id: room_id).last(500) end

もし、お分かりの方がいらっしゃいましたら教えて頂ければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

<% if !current_user?(@user) && logged_in? %>についてですが、
これはメッセージを送るのに、自分自身に送っても仕方ないので他の人の画面を表示しているときのみ送れるようにする、というロジックではないかと思います。

undefined method `identifier' for nil:NilClass

に関しては、さすがにこれだけでは何が起きているのか分からないですね…。

投稿2018/07/30 03:23

takahashim

総合スコア1877

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

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

messy1019

2018/07/30 10:02

ご回答頂きましてありがとうございます! おっしゃられていることに対して納得いたしました。 自分のIDが1として、1のページを表示した時に分かったのですが、例えば1の人が2のページに行っても、undefined method `identifier' for nil:NilClassのエラーが出てしまいます。。。
takahashim

2018/07/30 10:05

なるほど、エラーの出る状況はわかるのですが、 https://qiita.com/YN6127yn/items/7ddd966141cca195b4da のページを見てもidentifierというメソッドは特に記載されてないようですし、どこでエラーが出てその前後がどうなっていたかが分からないと何とも言えないのでした。
messy1019

2018/07/30 10:14

説明不足ですみません。 undefined method `identifier' for nil:NilClassの文言は、 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <% if !current_user?(@user) && logged_in? %> <section class="message_box"> <div id="messages"> <%= render @messages %> </div> </section> <script type="text/javascript"> var height = 0; $("div.message").each( function() { height += ($(this).height()); }); $('section.message_box').scrollTop(height); </script> <div class="message_form"> <%= render 'messages/message_form', {from_user: current_user, to_user: @user, room_id: @room_id} %> </div> <% end %> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー の中の上から4行目の<%= render @messages %>で発生しています。 今更ですが、影響してそうなコントローラーとモデルのコードを記載しました。
messy1019

2018/07/30 10:27

すみません、理由が分かりました! メッセージがそもそも1件もないので、@messageがないよということでした。 ためにしmysqlに手でデータを入れてみたところ表示されました。 お騒がせいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問