rails CanCan - определение разрешения для вложенной модели - PullRequest
1 голос
/ 11 февраля 2011

У меня есть две модели:

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 }

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

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

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

Я определил пользовательское разрешение для объекта Forum с именем 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 голосов
/ 07 марта 2012

Обычно вы бы использовали

user

, а не current_user

в пределах способности .rb.Это твоя ошибка?Также и ваша способность указана неверно.Вы хотите

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

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

0 голосов
/ 11 февраля 2011

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

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

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

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

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

...