มีหลายวิธีในการเปิดคอนโซล Ruby หรือ Rails:irb
, bundle exec irb
, bundle console
, และ rails console
เป็นบางส่วนที่พบบ่อยที่สุด ดูเหมือนคล้ายกันแต่ทำงานแตกต่างกันเล็กน้อย
หากคุณไม่รู้ว่าความแตกต่างเหล่านั้นคืออะไร คุณจะมีปัญหาบางอย่าง บางทีคุณอาจไม่สามารถเชื่อมต่อโมเดล ActiveRecord ของคุณกับฐานข้อมูลได้ หรือคุณจะต้องใช้ไฟล์และรับเวอร์ชันที่ไม่ถูกต้อง หรือห้องสมุดที่คุณคิดว่าจะสามารถใช้ได้ก็ไม่มี
คุณจะแน่ใจได้อย่างไรว่าคุณกำลังใช้คอนโซลที่ถูกต้องในเวลาที่เหมาะสม
การรวมกลุ่มกับผู้ที่ไม่ใช่กลุ่ม
irb
เป็นเพียงคอนโซล Ruby ธรรมดา ไม่สนใจ Gemfile
. ของคุณ . มันไม่โหลดอะไรเลยนอกจากไลบรารี Ruby หลัก อยากได้อะไรอีก ต้อง require
.
หากคุณติดตั้ง gem โดยใช้ gem install
คุณสามารถกำหนดให้ใช้ภายใน irb
. หากคุณใช้ bundle install
, คุณ อาจ สามารถทำได้ขึ้นอยู่กับว่า Bundler วางไว้ที่ใด (บางครั้ง Bundler จะใส่ gem ไว้นอกเส้นทาง gem ของ Ruby หากคุณเรียกใช้บางอย่าง เช่น bundle install --path
หรือ bundle install --deployment
)
ตั้งแต่ irb
ละเว้น Gemfile
. ของคุณ เวอร์ชันภายใน Gemfile.lock
. ของคุณ ไม่เป็นไร irb
จะโหลดอัญมณีเวอร์ชันใหม่ล่าสุดที่สามารถหาได้:
~/Source/testapps/consoles[master *] jweiss$ gem list rails
*** LOCAL GEMS ***
rails (4.2.0.beta2, 4.2.0.beta1, 4.1.5, 4.1.1)
~/Source/testapps/consoles jweiss$ cat Gemfile | grep rails
gem 'rails', '4.1.5'
~/Source/testapps/consoles jweiss$ irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.2.0.beta2"
ซึ่งอาจทำให้เกิดปัญหาแปลก ๆ กับรหัสของคุณ หากคุณไม่ได้คาดหวังไว้
irb
ดีมากถ้าคุณกำลังยุ่งกับไฟล์ Ruby หลัก รวดเร็วและไม่ต้องตั้งค่าใดๆ
แต่ถ้าคุณต้องการใช้ Gemfile
. ของคุณ เมื่อคุณเรียกใช้คอนโซล ให้เรียกใช้ bundle exec irb
แทนที่. bundle exec
อนุญาตให้ irb
เพื่อโหลดอัญมณีที่ Bundler รู้จักและ เท่านั้น อัญมณีที่ Bundler รู้เกี่ยวกับ:
~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.1.5"
เราได้เวอร์ชัน Rails ที่เราต้องการแล้ว
bundler/setup เทียบกับ Bundler.require
คุณจะเรียกใช้ bundle console
.เมื่อใด แทน bundle exec irb
?
bundle exec irb
ตั้งค่าเพื่อให้คุณต้องใช้อัญมณีใน Gemfile.lock
. ของคุณเท่านั้น .
bundle console
ก้าวไปอีกขั้นหนึ่ง เมื่อคุณเรียกใช้ bundle console
คุณไม่จำเป็นต้องมีอัญมณีใน Gemfile
. ของคุณด้วยซ้ำ . สิ่งเหล่านี้จำเป็นสำหรับคุณ:
~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> Rails.version
NameError: uninitialized constant Rails
from (irb):1
from /usr/local/bin/irb:11:in `<main>'
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.version
=> "4.1.5"
คุณอาจได้รับพฤติกรรมนี้หากคุณเรียก Bundler.require
ภายใน bundle exec irb
. ของคุณ คอนโซล อัญมณีใดๆ ใน Gemfile
. ของคุณ ที่ไม่ได้ทำเครื่องหมายว่า require: false
จะต้องใช้โดยอัตโนมัติ และคุณจะสามารถใช้งานได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม เมื่อคุณกำลังทำงานในโครงการที่มี Gemfile
ซึ่งสะดวกมาก
การเข้าถึงราง
ยังคงมีความแตกต่างอยู่อย่างหนึ่ง:bundle console
และ rails console
.
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.application
=> nil
~/Source/testapps/consoles jweiss$ rails console
Loading development environment (Rails 4.1.5)
irb(main):001:0> Rails.application
=> #<Consoles::Application:0x007f8db4d5ab30 @_all_autoload_paths=["/Users/jweiss...
bundle console
เพียงแค่ต้องการอัญมณีมากมาย rails console
ต้องใช้อัญมณีเหล่านั้น แต่จะโหลดสภาพแวดล้อม Rails ทั้งหมดของคุณ ตั้งค่าการโหลดอัตโนมัติ เริ่มต้นแอปพลิเคชันของคุณ และมอบสภาพแวดล้อม Rails เต็มรูปแบบให้คุณเล่นได้
คุณสามารถรับบางอย่างเช่นคอนโซล Rails จาก bundle console
หากคุณต้องการ config/environment.rb
:
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.application
=> nil
irb(main):002:0> require_relative 'config/environment.rb'
=> true
irb(main):003:0> Rails.application
=> #<Consoles::Application:0x007fd264f0b7c8 @_all_autoload_paths=["/Users/jweiss...
แต่ละอันซับซ้อนกว่าเล็กน้อย
สรุป:
-
irb
เป็นคอนโซล Ruby พื้นฐาน มันไม่สนใจGemfile
. ของคุณ และเข้าถึงได้เฉพาะคลาส Ruby หลักโดยไม่ต้องrequire
-ing พวกเขา ไม่สามารถโหลดอัญมณีที่ Bundler ติดตั้งนอกเส้นทางการโหลดของ RubyGems ได้อย่างง่ายดาย -
bundle exec irb
ก็เหมือนirb
หากคุณต้องการbundler/setup
. ด้วย . คุณต้องการอัญมณีที่อยู่ในGemfile.lock
. ของคุณเท่านั้น แต่คุณสามารถโหลดอัญมณีเหล่านั้นได้ไม่ว่า Bundler จะวางไว้ที่ใด -
bundle console
ก็เหมือนbundle exec irb
หากคุณเรียกBundler.require
. อัญมณีทั้งหมดในGemfile
. ของคุณ ยกเว้นที่มีเครื่องหมายrequire: false
, สามารถใช้ได้โดยไม่ต้องมี สะดวกมากเมื่อคุณเขียนอัญมณีของคุณเองหรือทำงานกับโค้ดที่ไม่ใช่ Rails -
rails console
ก็เหมือนกับการรันbundle console
ภายในแอป Rails หากคุณต้องการconfig/environment.rb
. คุณสามารถเล่นกับแอป Rails ทั้งหมดของคุณ การโหลดอัตโนมัติและการเชื่อมต่อฐานข้อมูล และทุกอย่างเป็นไปตามที่คุณคาดหวัง หากคุณกำลังใช้งานแอป Rails นี่เป็นคอนโซลที่มีประโยชน์ที่สุด
คอนโซลเหล่านี้มีความแตกต่างกันไม่มากนัก และในขณะที่ความแตกต่างเหล่านั้นส่วนใหญ่จะไม่ใหญ่เกินไป (โอ้ ไฟล์นี้ไม่จำเป็นหรือ ต้องใช้มันดีกว่า!) คนอื่นจะโกรธเคืองโดยสิ้นเชิงหากคุณไม่รู้ว่าเกิดอะไรขึ้น (ทำไมโหลดเวอร์ชั่นของคราดอีกครั้งผิด!?)
แต่ถ้าคุณรู้แนวคิดเบื้องหลังคอนโซลเหล่านี้ คุณจะสามารถใช้คอนโซลประเภทที่ถูกต้องในเวลาที่เหมาะสม และห้องสมุดทั้งหมดที่คุณต้องการจะอยู่ใกล้เมื่อคุณต้องการ