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