2013-09-24 5 views
0

У меня есть эта часть кода, которая определяет разрешения пользователя CanCan, но я не понимаю, для чего нужны условия внутри блока?CanCan и способный блок

class Ability 
      include CanCan::Ability 

      def initialize(user) 

      user.permissions.each do |permission| 
       can permission.action.to_sym, 
       permission.thing_type.constantize do |thing| 
       thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id 
       end 
      end 


end 
end 

Таким образом, эти строки кода пристанет мне:

permission.thing_type.constantize do |thing| 
     thing.nil? || permission.thing_id.nil? || permission.thing_id == thing.id 
end 

Я понимаю, что блок используется для определения сложных условий, и я думаю, что permission.thing_id == thing.id есть так, что разрешение предоставляется только для выбранных объектов но я не вижу пустого thing.nil? || permission.thing_id.nil?. Что это?

ответ

0

Итак, according to the CanCan docs, когда вы передаете блок can (это то, что здесь происходит), разрешение предоставляется, только если блок возвращает true. Объектом, переданным блоку, является объект, к которому пользователь может иметь разрешение на выполнение чего-либо.

Что это делает, то это дает пользователю разрешение на выполнение permission.action на классе permission.thing_type если:

  1. thing равна нулю. Это может произойти в случае таких вещей, как разрешение create, которое не принимает определенный объект (вместо этого он принимает класс).
  2. permission.thing_id - nil. Это касается случая, когда объект Permission не указывает на конкретную вещь. Это похоже на противоположную сторону элемента 1. Он может применяться в случае «полных» разрешений - разрешение, которое говорит, что конкретный пользователь может выполнить это действие по любому объекту этого класса. OR
  3. thing имеет идентификатор, указанный в объекте разрешения.

Мораль: комментарий вашего кода. Даже если вам сейчас ясно, что-то делает, это может быть не для следующего человека. Кто может быть и вам, через несколько месяцев.

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