มีหลายวิธีในการเปิดคอนโซล 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 นี่เป็นคอนโซลที่มีประโยชน์ที่สุด
คอนโซลเหล่านี้มีความแตกต่างกันไม่มากนัก และในขณะที่ความแตกต่างเหล่านั้นส่วนใหญ่จะไม่ใหญ่เกินไป (โอ้ ไฟล์นี้ไม่จำเป็นหรือ ต้องใช้มันดีกว่า!) คนอื่นจะโกรธเคืองโดยสิ้นเชิงหากคุณไม่รู้ว่าเกิดอะไรขึ้น (ทำไมโหลดเวอร์ชั่นของคราดอีกครั้งผิด!?)
แต่ถ้าคุณรู้แนวคิดเบื้องหลังคอนโซลเหล่านี้ คุณจะสามารถใช้คอนโซลประเภทที่ถูกต้องในเวลาที่เหมาะสม และห้องสมุดทั้งหมดที่คุณต้องการจะอยู่ใกล้เมื่อคุณต้องการ