Rails 5 Подписка на Action Cable канал из запроса ajax - PullRequest
1 голос
/ 16 марта 2019

Я пытался показать все сообщения разговора без обновления страницы только с помощью запроса ajax. С помощью этого кода я могу отправить сообщение с каналом, но не могу получить сообщение.

Я бы хотел динамически передавать ID из внешнего интерфейса. Я знаю, что это можно сделать с помощью параметра данных, добавленного в тег body (, например ).

Я хотел бы сделать то же самое, но когда я нажимаю на разговор, который изменяет данные тела "идентификатор разговора" и подписывается на новый идентификатор канала. Я надеюсь, что это можно сделать с помощью rails 5 / jquery (ajax).

Вот мой код:

conversation.coffee

App.conversation = App.cable.subscriptions.create channel: "ConversationChannel", id: document.querySelector('#conversation').dataset.conversationId,
  connected: ->
    $('#new_message').submit (e) ->
      $this = $(this)
      id = $this.find('#message_conversation_id');
      body = $this.find('#message_body')
      App.conversation.write id.val(), body.val()
      body.val('')
      e.preventDefault()
      return false

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
    $('.box-msg').append(data.data)

  write: (id, body) ->
    @perform 'write', {id: id, body: body}

conversation_channel.rb

class ConversationChannel < ApplicationCable::Channel
    def subscribed
      id = "[HOW CAN I PASS DYNAMICALLY ID]" 
      if id #on stream seulement si id existe
        stream_from "conversation_#{id}"
      end
    end

    def unsubscribed
      # Any cleanup needed when channel is unsubscribed
    end
    def write(data)
        msg = Message.create(
          conversation_id: data["id"], 
          body: data['body'], 
          user_id: 41,
          read: 0
        )
        if msg.save 
          html = ApplicationController.render(partial: 'messages/message', locals: { message: msg})
        end
        ActionCable.server.broadcast "conversation_#{data["id"]}", data: html
    end
  end

разговоры / index.html.erb

<script>
    $(document).ready(function() {
        $('.card-conversation').click(function() {
            $("#conversation-content").html('');
            var id = $(this).data("conversation");
            $("body").attr("data-conversation-id", id);
            $("#message_conversation_id").val(id); //input id 
            $.ajax({
                url: "/conversations/"+id+"/messages",
                cache: false,
                success: function(html){
                    $("#conversation-content").append(html);
                }
            });
            $("#conversation-content").fadeIn();
        });
    });
</script>
<div class="row h-100 no-margin">   
    <div class="col-md-4 h-100 messages-list" style="padding-right: 2px !important;">
            <% @conversations.first(3).each do |conversation| %>
                <div class="card card-conversation" data-conversation="<%=conversation.id %>">
                   <p>see conversation</p>
                </div>
            <% end %>
    </div>

    <div class="col-md-8 conversation no-padding" id="conversation">
        <div id="conversation-content"></div>
          <%= simple_form_for Message.new, url: "#" do |f| %>
              <%= f.input :body, label: false, placeholder: "Add msg" %>
              <%= f.input :conversation_id, label: false %>
              <%= f.submit 'Go' %>
          <% end %>
    </div>
</div>
...