สิ่งหนึ่งที่ทำให้การทำงานกับ Rails ดีมากคือสำหรับการเขียนโปรแกรมทั่วไปที่จำเป็น---การอนุญาต การดูแลเว็บไซต์ อีคอมเมิร์ซ คุณตั้งชื่อมันว่า---คนที่ฉลาดกว่าที่คุณน่าจะเขียนโค้ดวิธีแก้ปัญหาและจัดแพ็คเกจ ขึ้นเป็นอัญมณี
คุณสามารถเพิ่มอัญมณีลงใน Gemfile ของคุณและใช้ประโยชน์จากประโยชน์ของมันได้อย่างเต็มที่โดยไม่เข้าใจจริงๆ ว่ามันทำงานอย่างไร แต่คุณเคยสงสัยหรือไม่ว่าทั้งหมดนี้เชื่อมต่อเข้าด้วยกันได้อย่างไร
เราจะมาดูรายละเอียดเกี่ยวกับเพชรอนุมัติ CanCan ของ Ryan Bates อย่างละเอียดและตอบคำถามต่อไปนี้ (ซึ่งหากถามให้กว้างกว่านี้ อาจใช้กับอัญมณีใดก็ได้):
-
รหัสสำหรับ CanCan ถูกเก็บไว้ที่ไหน?
-
can?
. อยู่ที่ไหน วิธีการที่กำหนด? -
Rails โหลดโค้ดสำหรับ CanCan เมื่อใด/ที่ไหน/อย่างไร
อันดับแรก ฉันมี CanCan ใน Gemfile ของฉัน และฉันทำการ bundle install
:
# Gemfile
gem "cancan", "~> 1.6.10"```
$ bundle install
ด้วย Bundler มันง่ายมากที่จะดูว่าอัญมณีใด ๆ อาศัยอยู่ที่ใด เพียงใช้ bundle show
:
$ bundle show cancan
/Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
ที่ดูแลคำถาม # 1 ตอนนี้ can?
. อยู่ที่ไหน กำหนด?
$ cd /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
$ grep -r 'def can?' *
lib/cancan/ability.rb: def can?(action, subject, *extra_args)
lib/cancan/controller_additions.rb: def can?(*args)
ดูเหมือนว่าจริงๆ แล้วมี can?
ที่แตกต่างกันสองแบบ ฟังก์ชั่น. ที่เราสนใจคือ lib/cancan/ability.rb
.
# lib/cancan/ability.rb
def can?(action, subject, *extra_args)
match = relevant_rules_for_match(action, subject).detect do |rule|
rule.matches_conditions?(action, subject, extra_args)
end
match ? match.base_behavior : false
end
เท่าที่สิ่งที่เกิดขึ้นจริงที่นี่ การคาดเดาของคุณดีพอๆ กับของฉัน แต่นั่นไม่ใช่ส่วนสำคัญ ประเด็นสำคัญที่นี่คือ หากคุณกำลังเผชิญกับปัญหาบางอย่างกับอัญมณี ตอนนี้คุณก็พร้อมที่จะขุดรหัสของอัญมณีเพื่อพยายามค้นหาว่าเกิดอะไรขึ้น
ตอนนี้เรารู้แล้วว่ารหัสของอัญมณีถูกเก็บไว้ที่ไหนและจะเข้าไปได้อย่างไร แล้ว Rails รู้ได้อย่างไรเกี่ยวกับอัญมณี และมันจะโหลดรหัสของอัญมณีเมื่อใด
ซึ่งครอบคลุมอยู่ในบางส่วนของเอกสารการเริ่มต้น Rails นี่คือส่วนที่เกี่ยวข้อง:
ในแอปพลิเคชัน Rails มาตรฐาน มี Gemfile ที่ประกาศการพึ่งพาแอปพลิเคชันทั้งหมด config/boot.rb ตั้งค่า ENV['BUNDLE_GEMFILE'] เป็นตำแหน่งของไฟล์นี้ หากมี Gemfile อยู่ จำเป็นต้องใช้ Bundler/setup
สิ่งนี้เกิดขึ้นในช่วงต้นของกระบวนการเริ่มต้น:ขั้นตอนที่สองเป็นที่แน่นอน เรื่องนี้สมเหตุสมผลเพราะถ้าโครงการของคุณขึ้นอยู่กับอัญมณีชิ้นใดชิ้นหนึ่งใครจะรู้ว่าคุณอาจอ้างอิงถึงที่ใด ควรโหลดให้เร็วที่สุดเพื่อให้สามารถใช้โค้ดได้ทุกที่