【Ruby on Rails: cancancan】canの旅 (ソースコードリーディング)第二回
ということで、cancancanのソースコードリーディング第二回はじめます。
前回はコチラ
前回、Ruleクラスが定義されているRule.rbファイルのinitializeまで読んだ!
なので、また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
protecteddef 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の中身はまた次回!
まだまだ旅は長そうです!
おやすみなさいいいぃぃぃ