2014-12-17 4 views
0

Итак, в моей модели 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> 
+0

Ответ: Так что я получил ниже, чтобы работать для меня. wikiscontroller def index @wikis = policy_scope (Wiki) end –

ответ

0

ваша сфера условие неправильно

user.present? || user.blank? -> это будет верно всегда. если пользователь присутствует или пользователь пуст, он всегда будет возвращать только общедоступные wikis

Измените область видимости на что-то вроде ниже (если вы хотите, чтобы все общедоступные wiki, если пользователь не был подписан. Если пользователь зарегистрирован, вы хочу общественных + вики, созданные пользователем)

scope :visible_to, ->(user) { 
    user.nil? ? where(:private => false) : where(:private => false).or(:id => user.wiki_ids) 
} 

Если вы все еще не получаете то, что вы ожидаете, проверьте, если user.wiki_ids возвращает правильные значения

+0

Когда вошел в систему, ничего не отображается. Пользователь указан в вики. см. выше для примера DB. –

Смежные вопросы