2015-10-23 5 views
2

Использование Rails 4.2.4 с помощью приложения (3.5.2) и Pundit (1.0.1). Decent_exposure (2.3.2).Pundit: auhorize Index во вложенных ресурсах

У меня есть простая вложенная Associaton для пользователя и идей:

class User < ActiveRecord::Base 
has_many :ideas 
... 

class Idea < ActiveRecord::Base 
belongs_to :user 
... 

В routes.rb

devise_for :users 

resources :users do 
    resources :ideas 
end 

Тогда я просто пытаюсь запретить доступ пользователей к/1/идеям, если current_user является а не владельцем идей (в этом примере, если current_user.id! = 1). Я не могу понять, как это сделать. Я могу показать только те current_user идеи на индексном с:

[контроллер Идеи]

def show 
    authorize idea 
end 

[Идея политика]

def show? 
    @current_user == @idea.user 
end 

Но как я могу запретить пользователю просто перейдите на страницу индекса других пользователей? Я думаю, что в контроллере идеи, которые я должен использовать что-то вроде:

def index 
    authorize user 
end 

Но что? Как я могу отправить в пользовательскую политику информацию об коллекции Idea? Или я должен авторизовать с помощью самой идеи?

ответ

6

Дублирование my response on GitHub здесь, потому что это получает больше трафика.


Одним из способов является создание заглушки Idea принадлежащего пользователю санкционировать против.

def index 
    @user = User::find(params[:user_id]) 
    idea = Idea.new(user_id: @user.id) 

    authorize idea 

    # ... 
end 

и index? метод в вашем IdeaPolicy

def index? 
    record.user_id = user.id 
end 

Другой способ изменить то, что вы разрешаете против. Вместо авторизации от Idea авторизуйтесь против User.

def index 
    @user = User::find(params[:user_id]) 

    authorize @user, :show_ideas? 

    # ... 
end 

и создать новый метод show_ideas? на вашем UserPolicy

def show_ideas? 
    user.id == record.id 
end 
+0

Он отлично работает !! Большое спасибо. Второй подход более интуитивен для меня. Еще раз спасибо! – Galen

+0

Второй подход определенно имеет больше смысла и его легче понять. :) –

+0

deefour, какой из них является предпочтительным? (Я использую программу для проверки подлинности) –

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

  • Нет связанных вопросов^_^