tapitapi’s blog

1日1杯タピオカ!エンジニア

【Ruby on Rails: cancancan】canの旅 (ソースコードリーディング)第二回

目指せ!ruby&railsマスター!

 

ということで、cancancanソースコードリーディング第二回はじめます。

 

前回はコチラ

 

前回、Ruleクラスが定義されているRule.rbファイルのinitializeまで読んだ!

github.com

 

なので、またability.rbのcan methodに戻ってみます。

 def can(action = nil, subject = nil, *attributes_and_conditions, &block)
 add_rule(Rule.new(true, action, subject, *attributes_and_conditions, &block))
end

can :manage, Shop, user_id: user.idが実行されて、Rule.newでインスタンス変数に

@match_all = false

@base_behavior = true
@actions = :manage
@subjects = Shop
@attributes = user_id: user.id
@conditions = nil
@block = nil

 

がセットされた!

そして次に出会うのは。。。。add_rule method! 

 

これが定義されているのは、ability/rules.rb

module CanCan
 module Ability
  module Rules


   protected

    def rules
     @rules ||= [ ]
    end

 

   private

    def add_rule(rule)
     rules << rule
     add_rule_to_index(rule, rules.size - 1)
    end

 

    def add_rule_to_index(rule, position)
     @rules_index ||= Hash.new { |h, k| h[k] = [] }

     subjects = rule.subjects.compact
     subjects << :all if subjects.empty?

     subjects.each do |subject|
     @rules_index[subject] << position
    end
   end

 

(以下略)

end

 

まずprotectedとprivateの違いは???

どちらも自分&自分の子供(継承先)しか使えない(send methodを使えば使えてしまう、、、、)。

ただし、privateはレシーバ(self)を使えない。protectedは使える。

 

add_rule methodを見ていきます!

    def add_rule(rule)
     rules << rule
     add_rule_to_index(rule, rules.size - 1)
    end

 

引数ruleはRule.newで生成されたオブジェクト。

 

*rules << rule

 

rules メソッド(@rules ||= [ ])で作成された@rulesという空配列([ ])にRule.newで生成されたオブジェクトが入りました!

(@rules ||= [ ] とは、なにかが@rulesに入っていたらそのまま。入っていなければ[ ]という意味です)

 

can :manage, Shop, user_id: user.id

can :manage, Shop1, user_id: user.id

can :manage, Shop2, user_id: user.id

 

など増えていくと、@rulesに、どんどんRule.newで生成されたオブジェクトが入ってきます

 

こんな感じ(@testは@subjectsなどです)

[#<Rule:0x00005574e82b8fb0 @test="a", @test2="b", @test3="c">, #<Rule:0x00005574e82b8088 @test="a", @test2="b", @test3="c">, ..., .......どんどんつづく!!]

 

*add_rule_to_index(rule, rules.size - 1)

ruleは今回生成されたRuleオブジェクト。

rules.size - 1は、@rulesに入っているオブジェクト数にマイナス1した数ですね!

たとえば、いままで3つオブジェクトが入っていて、今回4つ目のオブジェクトだとすると、3が二番目の引数(rules.size - 1)になります。

 

add_rules_to_indexの中身はまた次回!

 

まだまだ旅は長そうです!

 

おやすみなさいいいぃぃぃ