#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.