2016-08-27 5 views
0

私はウィキの長いリスト(それらは記事のようなものです)を持つアプリケーションを作成しています。私はアプリでPunditを使用しています。ページネーション用の2つの宝石、will_paginatekaminariが見つかりました。スコープ付きクラスのレールでページネーションを使用するにはどうすればよいですか?

これはWikiControllerは、次のようになります。

class WikisController < ApplicationController 
    def index 
    if current_user == nil 
     @wikis = Wiki.visible_to_all 
    else 
     @wikis = policy_scope(Wiki) #pundit 
    end 

visible_to_allは、管理者以外のユーザーにすべての非プライベートなWikiを表示するには自家製の範囲です。

#on Wiki.rb (model) 
scope :visible_to_all, -> {where(private: [false, nil])} 

とにかく、今では私にはたくさんのウィキがあり、それらを改ページしたいと考えています。 will_paginateは、関連するコントローラでこれを行うには言う:

class UserController 

    def index 
    @users = User.paginate(:page => params[:page], :per_page => 5) 
    end 

は雷には、コントローラにこれを行うには言う:私の場合は

@users = User.order(:name).page params[:page] 

私はWikisをスコープしていますので、@users@wikisになります。 @wikisはすでにスコープに使用されています。私のスコープを維持し、私のWikiにページを設定するにはどうすればいいですか?

編集:wiki_policy.rb:

def resolve 
    wikis = [] 
    if user.role == 'admin' 
     wikis = scope.all # if the user is an admin, show them all the wikis 
    elsif user.role == 'premium' 
     all_wikis = scope.all 
     all_wikis.each do |wiki| 
     if wiki.private == false || wiki.private == nil || wiki.user == user || wiki.users.include?(user) 
      wikis << wiki # if the user is premium, only show them public wikis, or that private wikis they created, or private wikis they are a collaborator on 
     end 
     end 
    else # this is the lowly standard user 
     all_wikis = scope.all 
     wikis = [] 
     all_wikis.each do |wiki| 
     if wiki.private == false || wiki.users.include?(user) 
      wikis << wiki # only show standard users public wikis and private wikis they are a collaborator on 
     end 
     end 
    end 
    wikis # return the wikis array we've built up 
    end 
+0

追記:評論家・スコープへのスコープは、あなたがこのような何かを行うことができ、あなたは評論家のスコープに.visible_to_all範囲を統合することができませんでしたか?同様のcurrent_userは、Punditスコープ内のスコープ(ユーザとしてちょうど名前が付けられました)でも利用可能です。 – ollpu

+0

私はそれを探します!これは私が今までに作成した最初のアプリの1つで、効率的ではありませんでした。しかしそれは良い提案です!私は戻ってそれをリファクタリングします:)ありがとう! – Iggy

答えて

0

Wiki.visible_to_allpolicy_scope(Wiki)両方がfurher他の機能を連鎖することによりスコープすることができるActiveRecord::Relation返します。

@wikis = policy_scope(Wiki).paginate(:page => params[:page], :per_page => 5) 

EDIT:

あなたは、特定のスコープ(または関係)からページを取得するために必要なすべては、このように、それに.paginateを追加することであるvisible_to_allを統合するとして -

def resolve 
    if user.present? 
    # current_user is present, get the normal scope here 
    else 
    scope.where(private: [false, nil]) 
    end 
end 
+0

Iggy

+0

興味深いことに... 'policy_scope'は配列を返しています。 resolve-method(おそらくwiki_policy.rbファイル内)はどのように定義されていますか? – ollpu

+0

私の投稿を編集して、 'wiki_policy.rb'の解決メソッドを追加しました。どのようなタイプのファイルが返されるはずです(配列を返すとは思われませんか?) – Iggy

関連する問題