Почему мои частичные рельсы не отображаются правильно?

62
7

Я хочу добавить комментарии, не обновляя страницу в своем приложении. Тем не менее, моя часть не загружает должным образом функциональность JS, которую я реализую.

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

Кроме того, когда я просто пишу JS для добавления последнего комментария к идентификатору win_com, код работает. Я бы хотел, чтобы HTML динамически отображал текущее состояние частичного комментария через JS, а не просто добавлял последний комментарий. Любая помощь будет оценена! Вот мой код:

comments_controller.rb:

def create
@window = Window.find(params[:window_id])
@comment = @window.comments.build(comment_params)
@comment.user_id = current_user.id

if @comment.save
respond_to do |format|
format.html { redirect_to post_path(@post) }
format.js
end
end
end

views/windows/show.html.erb: (часть увеличенного изображения)

<div class="row col-md-7" id="win_com">
<h4>User Comments</h4>
<%= render partial: '/windows/comment', collection: @comments %>
</div>

просмотры/окно/_comment.html.erb:

<div class="container">
<div class="row col-md-7">
<p><%= comment.body %></p>
<p><%= link_to "Delete", [comment.window, comment], method: :delete,
data: {confirm: "Are you sure?"} %></p>
</div>
</div>

просмотров/комментарии /create.js.erb:

$('#win_com').html("<%= j render(partial:'/windows/comment', collection: @comments)%>");

application.js:

//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require turbolinks
//= require_tree .

Может быть, некоторые ключевые строки моего журнала?

Rendered windows/_comment.html.erb (0.0ms)
Rendered comments/create.js.erb (1.8ms)

спросил(а) 2016-01-06T00:30:00+03:00 5 лет, 3 месяца назад
1
Решение
61

Вам не хватает переменной экземпляра @comments в вашем действии action вашего контроллера. Рельсы не могут волшебно узнать, что это такое, если вы не указали это. Вы можете изменить действие своего действия на что-то вроде этого.

def create
@window = Window.find(params[:window_id])
@comment = @window.comments.build(comment_params)
@comment.user_id = current_user.id

if @comment.save
@comments = @post.comments //given that this is defined.
respond_to do |format|
format.html { redirect_to post_path(@post) }
format.js
end
end
end

ответил(а) 2016-01-06T01:24:00+03:00 5 лет, 3 месяца назад
44

.html() заменит все содержимое целевого элемента DOM вместо использования.append()

Замените это:

$('#win_com').html( "<%= j(render(partial:'/windows/comment', collection: @comments)) %>" );

При этом:

$('#win_com').append( "<%= j(render(partial:'/windows/comment', collection: @comments)) %>" );

ответил(а) 2016-01-06T01:20:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема