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

最後の部分.map { |e| e.story}が理由です。実際に使用するには、 asオブジェクトwill_paginate @storiesが必要です。しかし、ここでは、実際には不明ではない場所の単純な配列を取得しています。@storieswill paginatestoriestotal_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

電話をかけるmap { |e| e.story}と、will paginateコレクション(現在のページ、総ページ数などの情報が含まれています)を破棄し、まっすぐな配列に置き換えます。

このようなものが機能するはずです:

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

これにより、同じメタデータで新しいコンテンツを持つ新しいウィルパジネートコレクションが作成されます。

于 2012-09-03T10:22:05.483 に答える
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]) 
于 2012-09-03T18:53:10.650 に答える