2015-11-25 3 views
7

Я работаю над модулем chating. Для этого я использовал private_pub gem. В этом модуле я сделал три канала, но я не могу упомянуть всех здесь, потому что он покажет очень и очень большую страницу. Итак, давайте придерживаться одного канала.Файл js.erb выполняется два раза. Ruby on Rails - private_pub

я нажимаю на ссылку, имеющий канал "<%= subscribe_to "/conversations/send_invitation" %>" и затем ajax работы и идет к "conversations/send_invitation" (только один раз - что это нормально), и в моем "/conversations/send_invitation" у меня есть

def send_invitation 
@conversation = Conversation.new(conversation_params) 
respond_to do |format| 
format.js { render :layout => false } 
format.html 
end 
end 

, а затем в моем send_invitation.js.erb файле я следующие

<% publish_to "/conversations/send_invitation" do %> 
var recipient_id = "<%[email protected] %>"; 
var current_temp_user = $("#current_temp_user").val(); 

if(recipient_id == current_temp_user){ 
console.log('here') 
$("#invitation_div").html("<%=j(render :partial => '/restaurants/invitation')%>"); 
    card_modal = $('#invitation_card').modal(); 
    card_modal.modal('show'); 
} 
<% end %> 

Вот мой application.js файл

//= require jquery 
// require jquery-ui 
//= require jquery_ujs 
// require turbolinks 
//= require bootstrap 
//= require jquery.raty 
//= require private_pub 
//= require_tree . 

И модальные дисплеи на recipient side (что хорошо).

Теперь проблема в том, что я вижу два modal с same id в моем firefox console/html. И buttons за closing/submitmodal также прекратил работать. Также console.log в моем send_invitation.js.erb файле показал два раза результат console.log, поэтому ясно, что файл js.erb выполняется два раза. Но стоит отметить, что ajax работал только один раз. Я потратил пару часов на него и нашли только This link, который также не работает для меня, потому что когда я удалить либо jquery.js или jquery_ujs.js это дает мне ошибки

+0

Что говорит ваш журнал сервера? Выполнено ли действие 'send_invitation' один или два раза? Может быть, вы дважды подписываетесь на канал? Вы можете отладить это в консоли разработчика браузера. – coorasse

+0

@coorasse no он вызывает 'send_invitation' только один раз – ImranNaqvi

+0

, так что вы можете видеть в консоли разработчика, если вы подписались дважды на канал? – coorasse

ответ

0

не удалось найти решение, но я думал, что это «Стоит кому-то сообщить о фактической проблеме.

В моем случае проблема заключалась в том, что я делал два канала на одной странице, поэтому два раза делал рукопожатие с тонким сервером.

Примечание Но в общем случае это может случиться, если мы включили файл js два раза.

+0

Что значит делать каналы на одной странице? Имея <% = subscribe_to convers_path (разговор)%> дважды на странице и одну форму беседы или <% = subscribe_to conversation_path (разговор)%> только один раз, но имеющие две формы беседы? В моем случае это проблема с turbolinks. Если я выполняю полную перезагрузку страницы, все работает нормально, но если я создам диалог.message после перехода на другую страницу приложения, а затем вернусь, он будет отображаться больше раз (он сохраняет только 1 сообщение в db, только имея проблему с отображением). Какие-нибудь догадки? –

+0

Имран, кажется, я мог решить эту проблему. Проверьте мой ответ! –

0

С $(document).on('keydown', '.chatboxtextarea', function (event){....}); мой объект сообщения был создан только один раз, но отображался несколько раз в зависимости от того, сколько раз я возвращался на страницу с turbolinks без полной перезагрузки страницы. Чтобы обойти это в файле js.erb, я добавил event.handled, чтобы проверить, добавлено ли частичное.

application.js файл

//= require jquery 
//= require jquery-ui 
//= require jquery_ujs 
//= require turbolinks 
//= require jquery.remotipart 
//= require chat 
//= require refile 
//= require bootstrap-sprockets 
//= require private_pub 
//= require local_time 
//= require moment 
//= require fullcalendar 
//= require bootstrap-datetimepicker 
//= require_tree . 

JS

//submitting chat message (it's OUTSIDE $(document).on('page:change'..) 
//bind submit to document --> not affected by turbolinks 
$(document).on('keydown', '.chatboxtextarea', function (event) { 
    var id = $(this).data('cid'); 
    checkInputKey(event, $(this), id); 
}); 

function checkInputKey(event, chatboxtextarea, conversation_id) { 
    if (event.keyCode == 13 && event.shiftKey == 0) { 
    event.preventDefault(); 

    //checking if field is empty and submitting the form 
    message = chatboxtextarea.val(); 
    message = message.replace(/^\s+|\s+$/g, ""); 
    if (message != '') { 
     $('#conversation_form_' + conversation_id).submit(); 
    } 
    } 
} 

форма html.erb

<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) %> 

_message.html.erb

<li class="<%= self_or_other(message) %>"> 
    <div class="chatboxmessagecontent"> 
    <p> 
     <%= message.body %> 
    </p> 
    </div> 
</li> 

create.js.erb

<% publish_to @path do %> 
    var id = "<%= @conversation.id %>"; 
    var chatbox = $(".chatboxcontent"); 
    var lastMessage = chatbox.children().last(); 

    //with this one message will be displayed only once 
    if(event.handled !== true) { 

    $message = $('<%= j render @message %>'); 
    chatbox.append($message); 
    chatbox.scrollTop(chatbox[0].scrollHeight); 

    //for displaying incoming and outgoing messages differently 
    if(sender_id != receiver_id) { 
     chatbox.children().last().removeClass("self").addClass("other"); 
     chatbox.scrollTop(chatbox[0].scrollHeight); 
    } 

    event.handled = true; 
    }; 
<% end %> 
0

Используйте метод unbind для удаления нежелательных/нескольких вызовов, которые будут выполняться с вашими событиями. Это сделает трюк. Но причина множественных вызовов еще не ясна.

$("#foo").unbind("click", handler); 

Надеюсь, это поможет.

0

Используйте этот камень вместо

gem "private_pub", :git => 'https://github.com/ryleto/private_pub.git'

Смежные вопросы