Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Ruby Gems ทำงานอย่างไร?

สิ่งหนึ่งที่ทำให้การทำงานกับ Rails ดีมากคือสำหรับการเขียนโปรแกรมทั่วไปที่จำเป็น---การอนุญาต การดูแลเว็บไซต์ อีคอมเมิร์ซ คุณตั้งชื่อมันว่า---คนที่ฉลาดกว่าที่คุณน่าจะเขียนโค้ดวิธีแก้ปัญหาและจัดแพ็คเกจ ขึ้นเป็นอัญมณี

คุณสามารถเพิ่มอัญมณีลงใน Gemfile ของคุณและใช้ประโยชน์จากประโยชน์ของมันได้อย่างเต็มที่โดยไม่เข้าใจจริงๆ ว่ามันทำงานอย่างไร แต่คุณเคยสงสัยหรือไม่ว่าทั้งหมดนี้เชื่อมต่อเข้าด้วยกันได้อย่างไร

เราจะมาดูรายละเอียดเกี่ยวกับเพชรอนุมัติ CanCan ของ Ryan Bates อย่างละเอียดและตอบคำถามต่อไปนี้ (ซึ่งหากถามให้กว้างกว่านี้ อาจใช้กับอัญมณีใดก็ได้):

  1. รหัสสำหรับ CanCan ถูกเก็บไว้ที่ไหน?

  2. can? . อยู่ที่ไหน วิธีการที่กำหนด?

  3. 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

สิ่งนี้เกิดขึ้นในช่วงต้นของกระบวนการเริ่มต้น:ขั้นตอนที่สองเป็นที่แน่นอน เรื่องนี้สมเหตุสมผลเพราะถ้าโครงการของคุณขึ้นอยู่กับอัญมณีชิ้นใดชิ้นหนึ่งใครจะรู้ว่าคุณอาจอ้างอิงถึงที่ใด ควรโหลดให้เร็วที่สุดเพื่อให้สามารถใช้โค้ดได้ทุกที่