私はウィキの長いリスト(それらは記事のようなものです)を持つアプリケーションを作成しています。私はアプリでPunditを使用しています。ページネーション用の2つの宝石、will_paginateとkaminariが見つかりました。スコープ付きクラスのレールでページネーションを使用するにはどうすればよいですか?
これは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
追記:評論家・スコープへのスコープは、あなたがこのような何かを行うことができ、あなたは評論家のスコープに.visible_to_all範囲を統合することができませんでしたか?同様のcurrent_userは、Punditスコープ内のスコープ(ユーザとしてちょうど名前が付けられました)でも利用可能です。 – ollpu
私はそれを探します!これは私が今までに作成した最初のアプリの1つで、効率的ではありませんでした。しかしそれは良い提案です!私は戻ってそれをリファクタリングします:)ありがとう! – Iggy