【问题标题】:Rails 5: Kaminari gem with ajax setupRails 5:带有 ajax 设置的 Kaminari gem
【发布时间】:2017-12-01 12:45:41
【问题描述】:

我已经安装了kaminari gem,它在我的rails 5 应用程序中运行良好。在我有 cmets 的页面上,我试图通过 Ajax 实现分页,因此不刷新页面。 cmets 位于带有选项卡的面板内。

这是我目前的设置:

gem 'kaminari'

控制器动作

 def show
  @item = Item.find(params[:id])
  @comments = Comment.where(item_id: @item).order(created_at: :desc).page(params[:page])

  respond_to do |format|
    format.js  { render 'show.js.erb' }
    format.html
  end
end

show.js.erb

$("#pages-comments").html("<%= escape_javascript render(@comments) %>")
$("#paginator").html("<%= escape_javascript(paginate(@comments, remote: true)) %>")

show.html.erb

<div class="tab-pane" id="comments">
     <div class="pages-comments">
        <%= render 'comments/comment' %>
      </div>

      <div id="paginator">
         <%= paginate @comments, remote: true %>
      </div>

 </div>

即使当我单击分页链接时似乎正在呈现show.js.erb 文件,它也不会将我重定向到下一页。此外,我在浏览器检查器中也没有收到任何错误。

这是使用byebug 时控制台显示的内容:

  Rendering pages/show.js.erb
  Comment Load (1.8ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2  [["LIMIT", 10], ["OFFSET", 0]]
   (1.3ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  Shopper Load (1.2ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.2ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.3ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.2ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.4ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.2ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.5ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.3ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (0.3ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE Shopper Load (1.1ms)  SELECT  "shoppers".* FROM "shoppers" WHERE "shoppers"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.3ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  CACHE  (0.2ms)  SELECT COUNT(*) FROM (SELECT  1 FROM "comments" WHERE "comments"."item_id" = 8 ORDER BY "comments"."created_at" DESC LIMIT $1 OFFSET $2) subquery_for_count  [["LIMIT", 10], ["OFFSET", 0]]
  Rendered collection of comments/_comment.html.erb [10 times] (822.0ms)
   (1.0ms)  SELECT COUNT(*) FROM "comments" WHERE "comments"."item_id" = 8
  Rendered pages/show.js.erb (1205.3ms)

任何想法我可能做错了什么?

更新 1 在实施@Gabbar 回答后,当我点击下一页时,我得到了这个:

Started GET "/show/8?page=2" for 127.0.0.1 at 2017-12-01 16:51:39 +0200
Processing by PagesController#show as JS
  Parameters: {"page"=>"2", "id"=>"8"}
  Item Load (0.5ms)  SELECT  "items".* FROM "items" WHERE "items"."id" = $1 LIMIT $2  [["id", 8], ["LIMIT", 1]]
Completed 500 Internal Server Error in 3ms (ActiveRecord: 0.5ms)



TypeError (no implicit conversion of Integer into String):

app/controllers/pages_controller.rb:33:in `+'
app/controllers/pages_controller.rb:33:in `show'

【问题讨论】:

  • rails 中没有臭虫之类的东西。在您的问题中将其更改为 byebug
  • 您能否检查控制器的params[:page] 值是否在非常 ajax 请求后增加,如果不是,那么您需要在控制器params[:page] +1 增加它
  • 感谢@Aniket Shivam Tiwari 的回复,我刚刚注意到这是一个错字,我的意思是byebug。我真的在使用byebug
  • 感谢@Gabbar 的回复。我这样做了@item = Item.find(params[:id]) @comments = Comment.where(item_id: @item).order(created_at: :desc).page.params[:page] if params[:page].nil? redirect_to plans_path, notice:'no params!' end,当我刷新页面时,它确实重定向了我。因此,我没有得到 params[:page] 的任何值。正如你所说,我怎样才能在控制器中增加它?
  • 让我们试试下面给出的解决方案,让我知道以获得进一步的指导

标签: javascript ruby-on-rails ajax coffeescript kaminari


【解决方案1】:

你可以试试这个

 def show
  params[:page] ||= 1
  @item = Item.find(params[:id])
  @comments = @item.comments.order(created_at: :desc).page(params[:page])
  #if params[:page].class == String
    #params[:page].to_i = params[:page].to_i + 1
  #else
    #params[:page] = params[:page] + 1
  #end
  respond_to do |format|
    format.js  { render 'show.js.erb' }
    format.html
  end
end

在 show.js.erb 中

$(".pages-comments").html("<%= escape_javascript render(@comments) %>"); 
$("#paginator").html("<%= escape_javascript(paginate(@comments, remote: true)) %>");

【讨论】:

  • 我在控制台中遇到错误,请检查我的问题我已经用错误更新它。谢谢
  • params[:page].to_i += 1.to_i 替换为第 33 行
  • @Theopap 检查答案中的修改并尝试一下
  • undefined method to_i=' for 1:Integer Did you mean? to_i to_int to_f to_d to_s to_r to_c
  • params[:page].to_i += 1你能试试这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2018-05-18
  • 2011-07-06
  • 2012-02-18
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多