Rails ajax визуализирует частичный возврат пустого

#jquery #ruby-on-rails #ajax #acts-as-commentable

#jquery #ruby-on-rails #ajax #действует как комментируемый

Вопрос:

Я пытаюсь включить ajax-комментирование в своем приложении, и я могу отправить все просто отлично, но когда я пытаюсь отобразить список комментариев, он становится пустым. Кто-нибудь знает, как я могу это исправить? Заранее спасибо.

comments_controller.rb

 class CommentsController < ApplicationController

before_filter :authenticate_member!
before_filter :load_commentable
before_filter :find_member

def index
   redirect_to root_path
end

def new
    @comment = @commentable.comments.new
end

def create
    @comment = @commentable.comments.new(params[:comment])
    @comment.member = current_member
    respond_to do |format|
        if @comment.save
          format.html { redirect_to :back }
          format.json
          format.js
        else
          format.html { redirect_to :back }
          format.json
          format.js
        end
    end 
end

def destroy
    @comment = Comment.find(params[:id])
    respond_to do |format|
        if @comment.member == current_member || @commentable.member == current_member
          @comment.destroy
          format.html { redirect_to :back }
        else
          format.html { redirect_to :back, alert: 'You can't delete this comment.' }
        end
    end 
end

private

def load_commentable
    klass = [Status, Medium, Project, Event, Listing].detect { |c| params["#{c.name.underscore}_id"] }
    @commentable = klass.find(params["#{klass.name.underscore}_id"])
end

def find_member
    @member = Member.find_by_user_name(params[:user_name])
end 

end
  

statuses_controller

 def show
    @status = Status.find(params[:id])
    @commentable = @status
    @comments = @commentable.comments.order('created_at desc').page(params[:page]).per_page(15)
    @comment = Comment.new
    respond_to do |format|
      format.html # show.html.erb
      format.json { redirect_to profile_path(current_member) }
      format.js
    end
end
  

статусы/show.html.erb

 <% if member_signed_in? %>
    <div id="comm_form_wrap">
        <%= render "shared/comment_form" %>
    </div>

    <div id="comments_wrap comments_<%= @commentable.id %>">
        <%= render partial: "shared/comments", :collection => @comments, :as => :comment %>
    </div>
<% end %>
  

общий/_comments.html.erb

 <div id="comment_<%= comment.commentable.id %>_<%= comment.id %>" class="comments">
    <div class="com_con">
        <%= Rinku.auto_link(comment.content).html_safe %>
    </div>
</div>
  

комментарии/create.js.erb

 $("#comm_form_wrap").html("<%= escape_javascript(render :partial => 'shared/comment_form') %>");
$('#comment_box').val('');
$("#comments_<%= @commentable.id %>").html("<%= escape_javascript(render :partial => 'shared/comments', :collection => @comments, :as => :comment) %>")
  

Когда я проверяю консоль браузера, это показывает, что это происходит:

 $("#comm_form_wrap").html("<%= escape_javascript(render :partial => 'shared/comment_form') %>");
$('#comment_box').val('');
$("#comments_<%= @commentable.id %>").html("")
  

** РЕДАКТИРОВАТЬ**

 $("#comments_93").html("/n  </div>nn         <div class="com_con">n               testingn           </div>n       </div>nn")
  

Комментарии:

1. в консоли вашего браузера отображается, что отправляется запрос ajax? если он отправлен, выдает ли он какие-либо ошибки?

2. Да, запрос отправляется, и ошибок нет, область комментариев выглядит так, как будто она отображается, но на самом деле ничего не отображается

3. Я думаю, что знаю, что не так, но не знаю, что мне нужно сделать, чтобы исправить это. @comments определено в моем действии show в моем, statuses_controller но не определено в моем, comments_controller откуда исходит вызов create. Что мне нужно сделать, чтобы это сработало?

4. В вашем действии создания должны быть @comments, потому что именно оттуда вы вызываете свой файл create.js.erb

5. Да, это было так. Но теперь происходит что-то странное. Частичное не обновляется. Он перестал отображать пустой, но теперь он вообще не отображается, но если я проверю свою консоль браузера, он скажет, что он отображает то, что я хочу.

Ответ №1:

Последняя строка в вашем create.js.erb ссылается на id , который не существует на вашей HTML-странице. Измените его на #comments_wrap , и все будет хорошо.

Комментарии:

1. Извините, забыл изменить это в моей правке, но у div есть этот идентификатор. И я также добавил @comments в свой контроллер комментариев, поэтому он больше не возвращает пустое значение. Это просто вообще ничего не делает. Ошибок нет, отладчик показывает новый комментарий, но фактический рендеринг не выполняется.

2. Я вижу, что вы добавили идентификатор в div. Но похоже, что у вас есть два идентификатора с пробелом между ними. Если это так, это не сработает. Удалите часть comments_wrap из идентификатора и пробела тоже.

3. Да, извините, но я понял, что просто забыл изменить это здесь. Теперь все работает нормально.

Ответ №2:

На случай, если кто-то еще столкнется с этой проблемой, я решил это, определив @comments переменную в контроллере, которая создает действие и вызывает ajax.