rails每个都显示多条评论

时间:2017-09-04 06:04:17

标签: javascript ruby-on-rails

我的项目中有评论,我希望将它们显示为三个,并且还希望通过三个链接显示剩余的评论。如何渲染局部图像,以便在单击按钮时继续显示注释?帮助我

文章/ _comments.html.haml

 .container
  .row.news
   .col-sm-12.news{id: "post-comments-#{post.id}"}
    %h2 Users Comments
  - post.comments.order(:created_at).last(3).each do |comment|
    = render 'posts/comment', comment: comment
.news
  %h5 Add a comment:
  = form_for [post, post.comments.build], remote: true do |f|
    %p
      = f.text_area :text
    %p
      = f.submit

文章/ _comment.html.haml

.row.news-coment
  .col-sm-2
    %img= image_tag comment.user.avatar.url
  .col-sm-5
    .panel.panel-default
      .panel-heading
        %strong= link_to("#{comment.user.first_name} #{comment.user.second_name}", user_path(comment.user))
        %span.text-muted #{comment.created_at.strftime('%-d %B %Y, %H:%M:%S')}
     .panel-body
       = comment.text

评论/ create.js.haml

$("#post-comments-#{@post.id}").append("#{escape_javascript render('posts/comment', comment: @comment)}");

1 个答案:

答案 0 :(得分:0)

如果您通过表单创建post.com,并添加remote:true选项,则需要告诉控制器以js格式进行响应。我想它确实如此,你已经创建了创建js文件。

您需要附加创建的评论,可能会创建一个post.comments容器,例如:

#posts-container
  - post.comments.order(:created_at).last(3).each do |comment|
    = render 'posts/comment', comment: comment

你的create.js文件已经准备好了:

$("#post-container").append("#{escape_javascript render('posts/comment', comment: @comment)}");

请确保从控制器方法中以html和js格式进行响应,例如:

...
  if @comment.save
    format.html { }
    format.js   { }


为了在点击按钮时加载更多评论,您可以尝试以下步骤。

在当前控制器中创建一个方法,允许您根据最后一个注释加载下3个注释。您根据created_at属性(或任何您想要的)来命令注释,请求id小于传递值的那些元素,并且只需要3,如:

def load_comments
  @comments = Comment.order(created_at: :desc).where('id < ?', params[:comment_id]).limit(3) 
  respond_to :js
end

注意:看看limittake之间的区别。

然后,创建GET路线以响应您的请求,例如:

get 'load_comments', to: 'posts#load_comments' # posts was my controller, your can be anything

然后使用remote:true选项创建link_to,这将使请求通过最后comment.id,如:

<%= link_to 'Load More', load_comments_path(comment_id: @comments.last.id), remote: true, class: 'load-more' %>

注意我从@comments的ActiveRecordRelationship中获取最后一条评论的ID,因此您也需要定义它,在您的情况下可能在您当前的控制器中。

在您看来,如果link_to准备好发出请求,您需要设置上一条评论的ID来进行查询,您可以这样做:

<script>
  document.querySelector('.load-more').href = '/load_comments?comment_id=' + '<%= @comments.last.id %>'
</script>

最后,响应方法的load_comments.js.erb会迭代每个comment并呈现它,如:

<% @comments.each do |comment| %>
  $("#comments-table").append('<%= j render "comments/comment", comment: comment %>')
<% end %>
document.querySelector('.load-more').href = '/load_comments?comment_id=' + '<%= @comments.last.id %>'

还设置最后一条评论的ID以再次提出请求。

我的_comment.html.erb文件,如下所示:

<tr>
  <td><%= comment.text %></td>
  <td><%= comment.post.id %></td>
</tr>

希望它对你有所帮助。