rails chat с private_pub (действие контроллера с другого контроллера, JS на rails)
Я следую этому руководству, чтобы создать чат в реальном времени в приложении rails: http://josephndungu.com/tutorials/gmail-like-chat-application-in-ruby-on-rails
В отличие от этого примера, где вы можете нажать на кнопку, принадлежащую пользователю, и всплывающее окно чата останется на странице индекса пользователя (root), я хотел бы иметь "встроенный" чат, поэтому при переходе на страницу пользователь показывает страницу с запросом http и будет уже там и готов к вводу.
Как я мог это сделать? На данный момент, если я пытаюсь встроить приложение, говорит, что нет цветной файл. Я предполагаю, что причина в том, что JS загружается после рендеринга сайта, так что Встреченный файл не существует, когда это необходимо. Я попытался вызвать действие создания контроллера разговоров для контроллера пользователей, но мне не удалось его осуществить.
Вот текущий код:
Кнопка, которая инициализирует разговор:
<%= link_to "Send message", "#", class: "btn btn-success btn-xs start-conversation", "data-sid" => current_user.id, "data-rip" => @user.id %>
users.js (отправка данных для создания действия в контроллер разговоров)
$('.start-conversation').click(function (e) {
e.preventDefault();
var sender_id = $(this).data('sid');
var recipient_id = $(this).data('rip');
$.post("/conversations", { sender_id: sender_id, recipient_id: recipient_id }, function (data) {
chatBox.chatWith(data.conversation_id);
});
});
chat.js
chatBox = {
/**
* creates an inline chatbox on the page by calling the
* createChatBox function passing along the unique conversation_id
*
* @param conversation_id
*/
chatWith: function (conversation_id) {
chatBox.createChatBox(conversation_id);
$("#chatbox_" + conversation_id + " .chatboxtextarea").focus();
},
контроллер разговоров
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
render json: { conversation_id: @conversation.id }
end
def show
@conversation = Conversation.find(params[:id])
@receiver = interlocutor(@conversation)
@messages = @conversation.messages
@message = Message.new
end
private
def conversation_params
params.permit(:sender_id, :recipient_id)
end
def interlocutor(conversation)
current_user == conversation.recipient ? conversation.sender : conversation.recipient
end
show.html.erb (всплывающее окно разговора)
<div class="chatboxhead">
<div class="chatboxtitle">
<i class="fa fa-comments"></i>
<h1><%= @receiver.profile.first_name %> <%= @receiver.profile.last_name %></h1>
</div>
<div class="chatboxoptions">
<%= link_to "<i class='fa fa-minus'></i> ".html_safe, "#", class: "toggleChatBox", "data-cid" => @conversation.id %>
<%= link_to "<i class='fa fa-times'></i> ".html_safe, "#", class: "closeChat", "data-cid" => @conversation.id %>
</div>
<br clear="all"/>
</div>
<div class="chatboxcontent">
<% if @messages.any? %>
<%= render @messages %>
<% end %>
</div>
<div class="chatboxinput">
<%= form_for([@conversation, @message], :remote => true, :html => {id: "conversation_form_#{@conversation.id}"}) do |f| %>
<%= f.text_area :body, class: "chatboxtextarea", "data-cid" => @conversation.id %>
<% end %>
</div>
<%= subscribe_to conversation_path(@conversation) %>
(Эта последняя строка для гема private_pub)