Я делаю сайт с видео. Каждое видео можно прокомментировать в show.html.erb. Поскольку количество комментариев может быть большим, я сделал разбивку на страницы для комментариев, используя will_paginate. При создании/удалении новых комментариев я хочу обновить список комментариев и панель разбиения на страницы. Я не могу управлять комментариями и разбиением на страницы, которые нужно обновлять удаленно и хорошо работать.
Моя модель
class Video < ActiveRecord::Base
attr_accessible :description, :name, :src, :rating, :tag_list
acts_as_taggable
belongs_to :user
has_many :comments
validates :rating, presence: true, numericality: {:greater_than_or_equal_to => 0, :less_than_or_equal_to => 1000000}
validates_uniqueness_of :src
validates :name, presence: true
validates :src, presence: true
after_initialize :init
def init
self.rating ||= 0 #will set the default value only if it nil
end
end
У меня есть видео /show.html.erb
<p>Name: <%= @video.name %></p>
<p>Description: <%= @video.description %></p>
<div id="comments_form">
<%= render :partial => "comments/comment",
:collection => @comments %>
<%= will_paginate @comments %>
</div>
<div id="new_comment_form">
<%= render "comments/form" if current_user%>
</div>
У меня есть частичные комментарии /_form.html.erb
<%if @user%>
<%= form_for([@video.user, @video, @video.comments.build], remote: true) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<br />
<div class="field">
<%= f.label "Сообщение" %>
<br />
<%= f.text_field :body %>
<br/>
</div>
<div class="actions">
<%= submit_tag "Добавить сообщение", class: "btn btn-large btn-primary" %>
</div>
<% end %>
<%end%>
Мои комментарии /_comment.html.erb
<p>
<%if comment.user%>
<b><%= comment.user.name %></b> (создано <%= time_ago_in_words(comment.created_at) %> назад):
<%end%>
<%= comment.body %>
<%if comment.user == current_user%>
<%= link_to "Удалить сообщение", [comment.video.user, comment.video, comment],
:confirm => "Уверен?",
:method => :delete, remote: true %>
<%end%>
</p>
У меня есть контроллеры контроллеров /comments_controller.rb
class CommentsController < ApplicationController
...
def create
@video=Video.find(params[:video_id])
@comment = @video.comments.new(params[:comment])
@comment.user = current_user
@video=Video.find(params[:video_id]) unless @comment.save
@comments = @video.comments.paginate(page: params[:page], per_page: 10, order: 'created_at DESC')
respond_to do |format|
format.js
end
end
...
end
У меня есть комментарии \create.js.erb
$("#comments_form").html("<%= escape_javascript(render :partial => "comments/comment",
:collection => @comments) %><%= escape_javascript(will_paginate @comments) %>")
Все почти великолепно: мой новый комментарий создан, обновлен мой список страниц, но ссылки вместо /users/1/videos/17? Page = 1 are/users/1/videos/17/comments? Page = 1 Я пробовал трудно в течение двух дней, чтобы выяснить, как исправить эту проблему, но не использовать...
Это потому, что панель разбиения на страницы обновляется в видео/комментариях # create. По умолчанию контроллер/действие pagination - это индекс текущего контроллера. Вы можете принудительно вызвать контроллер/действие при создании ссылок на страницы, используя параметр параметра will_paginate params.
TBH, я бы рассмотрел использование видео/комментариев # index для включения комментариев вместо видео # show.