我有一组用户喜欢的故事,我想对它进行分页。
为此我尝试:(在用户控制器中)
@stories = @user.likes.paginate(page: params[:page]).map { |e| e.story}
但是我收到了一个错误:
undefined method 'total_pages' for #<Array:0x007f9548c4cdd8>
on partial:
<%= will_paginate @stories%>
(顺便说一下,它没有分页就可以正常工作) 我在这做错了什么?
更多信息:
模特之间的联系:
用户模型
class User < ActiveRecord::Base
has_many :stories
has_many :likes
end
喜欢型号:
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :story
end
故事模型:
class Story < ActiveRecord::Base
has_many :likes , dependent: :destroy
has_many :users , through: :likes, source: :users
end
答案 0 :(得分:1)
在调用paginate之前添加以下代码。
require 'will_paginate/array'
答案 1 :(得分:0)
最后一部分.map { |e| e.story}
是原因。实际上要使用will_paginate @stories
,您需要将@stories
作为will paginate
对象。但是在这里你只得到一个stories
的简单数组,其中total_pages
并不是真的未知。
我没有尝试以下但是它会有点像这样
#FOLLOWING LINE MAY NOT WORK DIRECTLY!!
@stories = @user.likes(:include => :story).paginate(page: params[:page])
要点@stories
应具有paginate
函数的输出。然后will_paginate
将与列表一起使用。
编辑:这个怎么样。
@stories = (@user.likes.map { |e| e.story}).paginate(page: params[:page])
实际上我现在无法测试它,所以只是试图根据我的假设弄清楚它。
答案 2 :(得分:0)
当您致电map { |e| e.story}
时,您将丢弃遗嘱分页集合(其中包含您所在的页面,总页数等信息)并将其替换为直接数组。
这样的事情应该有效:
likes = @user.likes.paginate(page: params[:page])
@stories = WillPaginate::Collection.create(likes.current_page, likes.per_page, likes.total_entries) do |pager|
pager.replace likes.collect {|l| l.story}
end
这将创建一个具有相同元数据但新内容的新意愿分页集合。
答案 3 :(得分:0)
我听说过如何做到这一点
但最好的是添加到用户模型:
class User < ActiveRecord::Base
has_many :stories
has_many :likes
has_many :liked_stories, through: :likes , source: :story
end
在控制器中
@stories = @user.liked_stories.paginate(page: params[:page])