0

我有一组用户喜欢的故事,我想对其进行分页。

为此我尝试做:(在用户控制器中)

@stories = @user.likes.paginate(page: params[:page]).map { |e| e.story}

但我得到一个错误: undefined method 'total_pages' for #<Array:0x007f9548c4cdd8>

部分:

<%= 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
4

4 回答 4

1

在调用 paginate 之前添加下面的代码。

require 'will_paginate/array'
于 2012-09-03T10:42:07.030 回答
0

When you call map { |e| e.story} you're throwing away the will paginate collection (which contains info such as which page are you on, total number of pages etc) and replacing it with a straight array.

Something like this should work:

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

This creates a new will paginate collection with the same metadata, but new contents.

于 2012-09-03T10:22:05.483 回答
0

最后一部分.map { |e| e.story}是原因。实际上要使用will_paginate @stories你需要有@storiesaswill 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]) 

实际上我现在无法测试它,所以只是试图根据我的假设来解决它。

于 2012-09-03T09:50:01.427 回答
0

我听说了一些方法如何做到这一点

但最好的方法是添加到 User 模型中:

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]) 
于 2012-09-03T18:53:10.650 回答