###前提・実現したいこと
rails4 ローカル環境
現在メッセージ機能を実装してラインのようなメッセージのやりとりができるようにしたいと思っています。
###発生している問題・エラーメッセージ
メッセージ機能は無事に実装できて、メッセージのやり取りをしているページで『相手のメッセージは左側』『自分のメッセージは右側』という表示の仕方にしようと思ったのですが、相手のメッセージがCouldn't find User with 'id'=
とエラーになり表示できません。
最初に試してみたときは正常に表示できたのですが、機能テストのためユーザーを増やして試してみたところ、先ほどのCouldn't find User with 'id'=
というエラーになってしまいました。
あと、
<% if @over_ten %> <%= link_to '以前のメッセージをすべて表示', '?m=all' %> <% end %>
とこのように10件以上の表示はリンクをクリックして表示させているのですが、正常に表示さえているユーザーとのメッセージもこのリンクをクリックするとCouldn't find User with 'id'=
と同じようにエラーになってしまいます。
###該当のソースコード
問題があると思われるviewのコード。
また、今回メッセージ機能は会話「conversations」、メッセージ「messages」として関連づけて作成したので、そちらのコントローラーとモデルなども記載します。
views/messages/index.html.erb
views/messages/index.html.erb
1 <% if @over_ten %> 2 <%= link_to '以前のメッセージをすべて表示', '?m=all' %> 3 <% end %> 4 5 <div class="ui segment"> 6 <% @messages.each do |message| %> 7 <% if message.user_id == current_user.id %> 8 <!-- 自分のメッセージ --> 9 <div class="item-right"> 10 <% user = User.find(message.user_id) %> 11 <strong><%= user.name %></strong> 12 <%= message.message_time %> 13 <%= message.body %> 14 </div> 15 <% else %> 16 <!-- 相手のメッセージ --> 17 <div class="item-left"> 18 <% user = User.find(message.user_id) %> 19 <strong><%= user.name %></strong> 20 <%= message.message_time %> 21 <i class="right triangle icon"></i> 22 <%= message.body %> 23 </div> 24 <% end %> 25 <% end %> 26 </div> 27 28 <!-- メッセージの送信 --> 29 <%= form_for [@conversation, @message], html: {class: "ui reply form"} do |f| %> 30 <div class="field"> 31 <%= f.text_area :body, class: "form-control" %> 32 </div> 33 <%= f.text_field :user_id, value: current_user.id, type: "hidden" %> 34 <div> 35 <%= f.submit "メッセージを送る" %> 36 </div> 37 <% end %>
messages_controller.rb
messages_controller.rb
messageモデル
class Message < ActiveRecord::Base belongs_to :conversation belongs_to :user validates_presence_of :body, :conversation_id, :user_id def message_time created_at.strftime("%m/%d/%y at %l:%M %p") end end
conversations_controller.rb
class ConversationsController < ApplicationController before_action :authenticate_user! def index @users = User.all @conversations = Conversation.all end def create if Conversation.between(params[:sender_id], params[:recipient_id]).present? @conversation = Conversation.between(params[:sender_id], params[:recipient_id]).first else @conversation = Conversation.create!(conversation_params) end redirect_to conversation_messages_path(@conversation) end private def conversation_params params.permit(:sender_id, :recipient_id) end end
Conversationモデル
class Conversation < ActiveRecord::Base belongs_to :sender, foreign_key: :sender_id, class_name: 'User' belongs_to :recipient, foreign_key: :recipient_id, class_name: 'User' has_many :messages, dependent: :destroy validates_uniqueness_of :sender_id, scope: :recipient_id scope :between, -> (sender_id,recipient_id) do where("(conversations.sender_id = ? AND conversations.recipient_id =?) OR (conversations.sender_id = ? AND conversations.recipient_id =?)", sender_id,recipient_id, recipient_id, sender_id) end def target_user(current_user) if sender_id == current_user.id User.find(recipient_id) elsif recipient_id == current_user.id User.find(sender_id) end end end
データベーステーブル
create_table "messages", force: :cascade do |t| t.text "body" t.integer "conversation_id" t.integer "user_id" t.boolean "read", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false end add_index "messages", ["conversation_id"], name: "index_messages_on_conversation_id", using: :btree add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree create_table "conversations", force: :cascade do |t| t.integer "sender_id" t.integer "recipient_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end
どのように相手のメッセージを取得したらいいのか教えて頂けると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/28 06:28
2017/03/28 07:14
2017/03/28 11:37
2017/03/28 11:56
2017/03/28 12:33
2017/03/28 13:16 編集
2017/03/28 13:27