我的项目中有评论,我希望将它们显示为三个,并且还希望通过三个链接显示剩余的评论。如何渲染局部图像,以便在单击按钮时继续显示注释?帮助我
文章/ _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)}");
答案 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
注意:看看limit
和take
之间的区别。
然后,创建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>
希望它对你有所帮助。