Итак, в моей модели wiki у меня есть атрибут для частного. Если private является истинным, вики не должны быть доступны для просмотра пользователям, которые не привязаны к wiki_id через отношения HABTM.Политика областей Rails не принимает дополнительных критериев
wiki.rb:
class Wiki
include Mongoid::Document
include Mongoid::Timestamps
has_and_belongs_to_many :users
field :title, type: String
field :body, type: String
field :private, type: Boolean, default: false
scope :visible_to, ->(user) {
user.present? || user.blank? ?
where(:private => false) : where(:private => false).or(:id => user.wiki_ids)
}
def public?
!self.private?
end
end
WikisController:
def index
#@wikis = policy_scope(Wiki)
#@wikis = Wiki.all
@wikis = Wiki.visible_to(current_user)
authorize @wikis
end
def show
@wiki = Wiki.find(params[:id])
end
def new
@wiki = Wiki.new
authorize @wiki
end
def create
@wiki = current_user.wikis.build(params.require(:wiki).permit(:title, :body, :private, :user))
authorize @wiki
if @wiki.save
flash[:notice] = "Wiki was saved."
redirect_to @wiki
# report success
else
flash[:error] = "There was an error saving your wiki. Please try again."
render :new
end
Я довольно уверен, его объем, который должен быть изменен в модели, потому что если я закомментировать область в модель и замените индекс в контроллере на Wiki.all. Я вижу все вики. Как сейчас, как кто-то, кто создал wiki plus, помечен как закрытый, и я вошел в систему. Я не вижу эту вики и не кто-нибудь, кого я добавляю в качестве пользователя в wiki.
Я попытался добавить другие условия до конца, такие как user.present? ? where(:id => user.wiki_ids)
и user.present? && where(:id => user.wiki_ids)
, но просто получить ошибки, отброшенные на меня.
запись БД для пользователя:
User_id: 547eb8867261691268000000, wiki_ids: [BSON::ObjectId('54807226726 1690be0260000'),
BSON::ObjectId('5480735c7261690bae000000'), BSON::ObjectId('548
136e57261690aef000000'), BSON::ObjectId('5489af337261690d95000000'),
BSON::Objec tId('5489b57e7261690d95010000'),
BSON::ObjectId('548f9f607261690bb5060000'), BSO
N::ObjectId('54908f127261690be8000000'),
BSON::ObjectId('54908f207261690be801000 0')], name: "Carey VonRueden",
email: "[email protected]", encrypted_password: "$2a
$10$NrlQ2XH64UucOPcI1aje9.57eoSO74676264YrIjfGvncyGcpGWy",
reset_password_token : nil, reset_password_sent_at: nil,
remember_created_at: nil, sign_in_count: 7, current_sign_in_at:
2014-12-17 18:51:15 UTC, last_sign_in_at: 2014-12-16 02:38:5 8 UTC,
current_sign_in_ip: "10.0.2.2", last_sign_in_ip: "10.0.2.2",
confirmation
_token: nil, confirmed_at: 2014-12-03 07:15:18 UTC, confirmation_sent_at: nil, u nconfirmed_email: nil, role: "admin">
DB вход для Wiki:
Wiki _id: 54908f207261690be8010000, created_at: 2014-12-16 19:59:28 UTC, updated_at: 2014-12-16 19:59:28 UTC, user_ids:
[BSON::ObjectId('547eb886726169126 8000000')], title: "Private", body:
"Private", private: true>
Ответ: Так что я получил ниже, чтобы работать для меня. wikiscontroller def index @wikis = policy_scope (Wiki) end –