2011-02-11 2 views
1

У меня есть две модели:рельсы канкан - Определение разрешения для вложенной модели

Thread (id, title) 
ThreadParticipation (id, thread_id, user_id) 

Я хочу, чтобы определить что-то вроде:

can :create, ThreadParticipation if the user is a ThreadParticipation 

пример:

for 
    thread: (1, 'hello world') 
    thread_participation: (313, 1, 13) -- where 13 is the user_id 

Я попытался :

can :create, ThreadParticipation, :thread_participations => { :user_id => current_user.id } 

Но это ошибки. Есть идеи?

+1

Это было очень очень очень очень очень серьезная ошибка? : D Сложно диагностировать без какого-либо сообщения об ошибке! – Zabba

ответ

0

В настоящее время я пытаюсь добиться чего-то похожего, но у меня нет всего этого. Попробуйте следующее:

can :create, ThreadParticipation => Thread, do |participation, thread| 
    # your definition here 
end 

Это также должно работать без блока.

РЕДАКТИРОВАТЬ: отбросьте часть выше, которая еще не работает в CanCan. Я реализовал свое собственное решение, но оно требует, чтобы вы вручную разрешали действия контроллера, что не так красиво, но более безопасно, на мой взгляд.

Я реализовал это так для моего проекта: https://gist.github.com/822208

+0

Спасибо, но я в замешательстве. Это CanCan поддерживается или нет? Я действительно ищу решение CanCan без добавления дополнительной сложности ... – AnApprentice

+0

CanCan не поддерживает вложенные ресурсы на данный момент (IMO). Решение gist - это решение CanCan, посмотрите на него снова. Я просто не могу использовать? ... в моих взглядах, но user_ability.can? потому что с может? вы можете использовать только один аргумент (current_user или что-то еще). создавая способность самостоятельно, вы можете определить больше (как в моем примере, пользователь и компания) и можете работать над этим. – pduersteler

1

Thread вообще просто плохое название модели, потому что он будет конфликтовать с Thread класса, определенного в Ruby. Я реализовал это совсем недавно. В моем примере у меня есть форумы и темы. Человек не должен создавать новую тему на форуме, к которому у них нет доступа для чтения.

Я определил пользовательское разрешение на объекте Форума называется create_topic для этого:

can :create_topic, Forem::Forum do |forum| 
    can?(:read, forum) && user.can_create_forem_topics?(forum) 
end 

Где can_create_forem_topics? только определенный на User модели, как это:

def can_create_forem_topics?(forum) 
    # code goes here 
end 

Тогда я просто использовать этот обычай :create_topic Способность в действиях new и create в моем TopicsController, где @forum определяется как before_filter:

authorize! :create_topic, @forum 

И если мне нужно использовать его в представлениях:

can? :create_topic, @forum 

путем определения пользовательского разрешения на родительский объект,

0

Обычно вы бы пользователь

user 

не current_user

внутри способность.rb. Это ваша ошибка? Кроме того, ваша способность указана неправильно.Вы хотите

can :create, ThreadParticipation, :user_id => user.id 

Обратите внимание, что : user_id является свойством ThreadParticipation модели

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