Kaminari、分页、AJAX 奇怪的行为
Kaminari, pagination, AJAX strange behaviour
我设法使我的 AJAX 页面加载工作正常,但我 运行 遇到一些我不知道如何修复的问题:我将每页的条目数设置为 4。首先页面加载 4 个项目好,但在下一页,它加载超过 4 个项目。这是为什么?
实时站点:https://serene-waters-1174.herokuapp.com/
我检查了日志,发现 OFFSET
在每次 ajax 加载后都没有保持一致。 ON page load OFFSET
是为了,就像我想要的,在后续加载中,OFFSET
是 0
。
Started GET "/users/index?page=2" for ::1 at 2015-06-18 21:17:29 +0200
Processing by UsersController#index as JS
Parameters: {"page"=>"2"}
User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."name" ASC LIMIT 4 OFFSET 4
Rendered users/_user.html.erb (0.3ms)
(0.2ms) SELECT COUNT(*) FROM "users"
Rendered users/index.js.erb (35.3ms)
Completed 200 OK in 45ms (Views: 42.5ms | ActiveRecord: 1.1ms)
Started GET "/users/index" for ::1 at 2015-06-18 21:17:34 +0200
Processing by UsersController#index as JS
User Load (0.8ms) SELECT "users".* FROM "users" ORDER BY "users"."name" ASC LIMIT 4 OFFSET 0
Rendered users/_user.html.erb (0.9ms)
(0.2ms) SELECT COUNT(*) FROM "users"
Rendered users/index.js.erb (48.3ms)
Completed 200 OK in 59ms (Views: 57.1ms | ActiveRecord: 1.0ms)
user.rb
class User < ActiveRecord::Base
paginates_per 4
end
user_controller.rb
class UsersController < ApplicationController
def index
@users = User.order(:name).page params[:page]
respond_to do |format|
format.html
format.js {}
end
end
def show
@user = User.find(params[:id])
end
end
index.html.erb
<h1>All users in database.</h1>
<div id="paginator">
<%= paginate @users, :remote => true %>
</div><br>
<div id="list">
<%= render 'user' %>
</div>
index.js.erb
$('#list').html('<%= escape_javascript render(@users) %>');
$('#paginator').html('<%= escape_javascript(paginate(@users, :remote => true).to_s) %>');
如果您能帮助我获取 "next" 链接以使用 ajax 加载页面,我将不胜感激。
编辑:
我从页面源代码中意识到,没有所有页面只显示 4 个项目。完美的。但在视图中,它显示了 4 个项目,并重复了 4 次相同的项目。
编辑:
这修复了部分问题。我之前在局部使用 .each
循环。
<%= "Name: #{user.name}" %> <br>
<%= "Email: #{user.email}" %><br>
<%= "Album: #{user.album}" %>
<p>======</p>
感谢 smathy!
OFFSET
由 params[:page]
管理 - 正如您在日志中看到的那样,:page
参数未在第二个请求中发送。
但是,其中的 none 可以解释为什么一个页面上显示的用户超过 4 个,两个 SQL 查询都显示正确的 LIMIT 4
所以也许您还有另一个错误您的 JS 用于更新 DOM 或者可能在您的用户部分中并且它正在添加用户而不是替换它们。
对我有用的是将部分保留为 .each
循环,但更改我的 js.erb 文件以呈现部分而不是实例变量。
$('#certs').html('<%= escape_javascript render "certifications/certification" %>');
我设法使我的 AJAX 页面加载工作正常,但我 运行 遇到一些我不知道如何修复的问题:我将每页的条目数设置为 4。首先页面加载 4 个项目好,但在下一页,它加载超过 4 个项目。这是为什么?
实时站点:https://serene-waters-1174.herokuapp.com/
我检查了日志,发现 OFFSET
在每次 ajax 加载后都没有保持一致。 ON page load OFFSET
是为了,就像我想要的,在后续加载中,OFFSET
是 0
。
Started GET "/users/index?page=2" for ::1 at 2015-06-18 21:17:29 +0200
Processing by UsersController#index as JS
Parameters: {"page"=>"2"}
User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."name" ASC LIMIT 4 OFFSET 4
Rendered users/_user.html.erb (0.3ms)
(0.2ms) SELECT COUNT(*) FROM "users"
Rendered users/index.js.erb (35.3ms)
Completed 200 OK in 45ms (Views: 42.5ms | ActiveRecord: 1.1ms)
Started GET "/users/index" for ::1 at 2015-06-18 21:17:34 +0200
Processing by UsersController#index as JS
User Load (0.8ms) SELECT "users".* FROM "users" ORDER BY "users"."name" ASC LIMIT 4 OFFSET 0
Rendered users/_user.html.erb (0.9ms)
(0.2ms) SELECT COUNT(*) FROM "users"
Rendered users/index.js.erb (48.3ms)
Completed 200 OK in 59ms (Views: 57.1ms | ActiveRecord: 1.0ms)
user.rb
class User < ActiveRecord::Base
paginates_per 4
end
user_controller.rb
class UsersController < ApplicationController
def index
@users = User.order(:name).page params[:page]
respond_to do |format|
format.html
format.js {}
end
end
def show
@user = User.find(params[:id])
end
end
index.html.erb
<h1>All users in database.</h1>
<div id="paginator">
<%= paginate @users, :remote => true %>
</div><br>
<div id="list">
<%= render 'user' %>
</div>
index.js.erb
$('#list').html('<%= escape_javascript render(@users) %>');
$('#paginator').html('<%= escape_javascript(paginate(@users, :remote => true).to_s) %>');
如果您能帮助我获取 "next" 链接以使用 ajax 加载页面,我将不胜感激。
编辑: 我从页面源代码中意识到,没有所有页面只显示 4 个项目。完美的。但在视图中,它显示了 4 个项目,并重复了 4 次相同的项目。
编辑:
这修复了部分问题。我之前在局部使用 .each
循环。
<%= "Name: #{user.name}" %> <br>
<%= "Email: #{user.email}" %><br>
<%= "Album: #{user.album}" %>
<p>======</p>
感谢 smathy!
OFFSET
由 params[:page]
管理 - 正如您在日志中看到的那样,:page
参数未在第二个请求中发送。
但是,其中的 none 可以解释为什么一个页面上显示的用户超过 4 个,两个 SQL 查询都显示正确的 LIMIT 4
所以也许您还有另一个错误您的 JS 用于更新 DOM 或者可能在您的用户部分中并且它正在添加用户而不是替换它们。
对我有用的是将部分保留为 .each
循环,但更改我的 js.erb 文件以呈现部分而不是实例变量。
$('#certs').html('<%= escape_javascript render "certifications/certification" %>');