我对模型Page
的观点有很长的评论。我没有在页面加载上显示所有评论,而是尝试创建一个“查看更多”按钮,显示接下来的十条评论。该按钮向控制器发送ajax请求,然后控制器使用jquery:
_view_more.html.erb
<% comments.each_with_index do |comment, index|%>
<% if (( index > @start_number) && (index < @end_number) ) %>
<%= comment.text %>
<% end %>
假设我总是希望显示接下来的10条评论。我只想设置@start_number = @start_number + 10
和@end_number = @end_number + 10
在控制器中,但实例变量被重置,因此@start_number
将为零。如何在每个ajax请求时设置一个增加10的变量?
“查看更多”按钮
<%= link_to "view more", view_more_page_path, remote: true %>
pages_controller.rb
def view_more
@page = Page.find(params[:id])
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
end
view_more
$("#comments-body").append("<%= escape_javascript(render 'view_more') %>");
答案 0 :(得分:4)
我将使用haml
和coffee-script
在呈现comments
时,您将html5
data attribute
与id
的{{1}}放在一起:
comment
评论部分
#view where to render comments
%div#comments-wrapper{:"data-pageid" => @page.id}
=render @comments
=link_to "View more", "#", id: "view-more-link"
application.coffee
#comments/_comment.html.haml
%p.single-comment{:"data-commentid" => comment.id}
=comment.body
comments_controller
$ ->
$("#view-more-link").on 'click', ->
last_comment_id = $("#comments-wrapper .single-comment").last().data('commentid')
page_id = $("#comments-wrapper").data("pageid")
$.ajax
url: "/comments/view_more"
dataType: "script"
data:
last_comment_id: last_comment_id
page_id: page_id
评论/ view_more.js.erb
def view_more
@page = Page.find(params[:pageid])
if params[:last_comment_id]
@comments = @page.comments.where("comments.id > ?", params[:last_comment_id]).limit(10)
end
respond_to do |format|
format.js
end
end
注意:我不知道您的路线是如何设置的,所以我也将$("#comments-wrapper").append("<%= escape_javascript(render @comments) %>");
作为数据属性
答案 1 :(得分:4)
我会使用已经实现的分页宝石kaminari或will_paginate。我将使用will_paginate创建此示例。
首先,重要的是要说您的方法不正确,因为会加载所有评论每个view_more
请求。如果你想显示10条评论,那么从数据库中只选择它们吧?分页宝石将为您做到!
我们来代码:
“查看更多”按钮
<%= link_to "view more", view_more_page_path, remote: true, id: 'view-more-btn' %>
<强> pages_controller.rb 强>
def view_more
@comments = Page.find(params[:id]).comments.paginate(page: params[:page], per_page: 10)
respond_to do |format|
format.html { redirect_to root_path }
format.js
end
end
<强> _view_more.html.erb 强>
<% @comments.each do |comment| %>
<%= comment.text %>
<% end %>
<强> view_more.js.erb 强>
$("#comments-wrapper").append("<%= escape_javascript(render 'view_more') %>");
# We need to update the 'view more' link with the next page number
$('#view-more-btn').attr('href', '<%= view_more_page_path((params[:page] || 0) + 1) %>')
答案 2 :(得分:0)
在使用count进行ajax调用之前更新隐藏变量是不是很好?
var currentVal = parseInt($("[type=hidden]").val());
$("[type=hidden]").val( currentVal + 1 );
在评论部分的开头添加隐藏字段,默认值为&#34; 0&#34;
<input type="hidden" name="hiddenId" id="hiddenId" value="0">
希望它会有所帮助
答案 3 :(得分:0)
如果您想要快速而肮脏的方法,可以将start_number和end_number保存在cookie内。
但是,跟踪客户端下一步需要呈现的内容将是正确的做法。