

現在、ruby on railsにてactioncableを用いた動的なチャットを作成しています。  
チャット機能は十分とは言えませんが、機能としては大体完成しました。  
LINEのように送信したメッセージ、受信したメッセージを右と左に分けると考えたときに  
データベースから引っ張ってきたメッセージは右と左にわけられるのですが、入力した場合、データベースにインサートされるのですが、そこから相手に通知がいかず、相手の画面に変化はなく、メッセージが表示されないという結果になりました。  
実行した時のコードはいかになります。

* * *

MessageBroadcastJob

[code]

        class MessageBroadcastJob < ApplicationJob
      queue_as :default
    
      def perform(message)
        if message.user_id.nil?
          # オールチャット用のブロードキャスト　宛先がない場合はroom_channelにストリームされる。
          ActionCable.server.broadcast "room_channel",message: render_message(message)
        else
          # 宛先を指定した場合のストリーム　ルームチャンネルの語尾にユーザIDが付与され、ブロードキャストされる
          # 送る相手にストリーム
          ActionCable.server.broadcast "room_channel#{message.user_id}",message: render_message(message)
          # 自分にストリーム
          ActionCable.server.broadcast "room_channel#{message.userid}",message: render_message(message)
        end
      end
    
      private
        def render_message(message)
          ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
        end
    end
    
[/code]

※ userid：自分のユーザID user_id:相手のユーザID  
わかりにくくてすみません。

* * *

viewは以下のコードであります。

room.html.erb

[code]

    <h1><%= @user_id_to.name %>さんとのメッセージ</h1>
    
            <div id="messages">
              <%= render @messages %>
            </div>
    
            <form>
              <label>Say something:</label><br>
              <input type="hidden" value= <%= @user_id_to %> data-behavior="room_speaker">
              <input type="text" data-behavior="room_speaker">
            </form>
    
[/code]

* * *

render先  
_message.html.erb

[code]

    <% cache message do %>
    <div class="message">
        <% if message.userid == current_user.id %>
        <p class="right_balloon">
        <% else %>
        <p class="left_balloon">
        <% end %>
        <%= message.content %>
        </p>
    </div>
    <% end %>
    
[/code]

* * *

しかし、render先を以下のコードにすると動的に送信、受信ができました。

[code]

    <% cache message do %>
    <div class="message">
        <p class="left_balloon">
        <%= message.content %>
        </p>
    </div>
    <% end %>
    
[/code]

参考になるような意見等、お待ちしております。  
文章長くなってしまいましたが、よろしくお願いします。


CC BY-SA 3.0
2016-12-27T07:45:37.283
31462
2020-04-12T10:02:38.303
2020-04-12T10:02:38.303
32986
20036
question
ruby-on-rails erb
ruby on rails actioncableにてrender partialにてerbの<%= if %>が正常に動作しない


検証のとおり、 `_message.html.erb` に問題がありそうです。  
なのでそのファイルだけに注視して考えるならば:

[code]

    <div class="message">
        <% if message.userid == current_user.id %>
        <p class="right_balloon">
          <%= message.content # 追記 %>
        </p><!-- 追記 -->
        <% else %>
        <p class="left_balloon">
          <%= message.content # 追記 %>
        </p><!-- 追記 -->
        <% end %>
        <%= # message.content 削除 %>
        <!-- </p> 削除 -->
    </div>
    
[/code]

と、分岐ごとに閉じタグも併記すると動いてくれるのではないでしょうか

あるいは、 `if` を記述している部分は、もしかしたら以下のように行数を削減して書けるかもしれません

[code]

    <div class="message">
      <% class_name = message.userid.eql?(current_user.id) ? 'right_balloon' : 'left_balloon' %>
      <%= content_tag(:p, message.content, class: class_name) %>
    </div>
    
[/code]

何か参考になれば幸いです

* * *

  * [content_tag - Ruby on Rails API](http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag)


CC BY-SA 3.0
2017-01-13T20:10:22.080
31827
2017-01-13T20:10:22.080
3861
31462
answer