มีวิธีส่งไฟล์ Ruby, foo.rbไปยังคอนโซลราง ผลลัพธ์ที่คาดไว้จะเกิดขึ้นหลังจากคอนโซลเริ่มสภาพแวดล้อมรางเพื่อเรียกใช้ไฟล์
หรือวิธีอื่นใดที่จะทำให้ฉันสามารถเรียกใช้ไฟล์ในสภาพแวดล้อมทางรถไฟที่เรียกใช้จากพรอมต์คำสั่ง
มีวิธีส่งไฟล์ Ruby, foo.rbไปยังคอนโซลราง ผลลัพธ์ที่คาดไว้จะเกิดขึ้นหลังจากคอนโซลเริ่มสภาพแวดล้อมรางเพื่อเรียกใช้ไฟล์
หรือวิธีอื่นใดที่จะทำให้ฉันสามารถเรียกใช้ไฟล์ในสภาพแวดล้อมทางรถไฟที่เรียกใช้จากพรอมต์คำสั่ง
คำตอบ:
จริงๆแล้ววิธีที่ง่ายที่สุดคือเรียกใช้โดยload
ภายในไฟล์rails console
load './path/to/foo.rb'
คุณสามารถใช้ได้
bundle exec rails runner "eval(File.read 'your_script.rb')"
UPDATE:
สิ่งที่เราใช้กันมากเมื่อเร็ว ๆ นี้คือการโหลดสภาพแวดล้อมรางจากภายในสคริปต์เอง พิจารณาdoit.rb
:
#!/usr/bin/env ruby
require "/path/to/rails_app/config/environment"
# ... do your stuff
นอกจากนี้ยังใช้งานได้หากสคริปต์หรือไดเร็กทอรีการทำงานปัจจุบันไม่อยู่ในไดเร็กทอรีของแอพ rail
f=File.new('path/to/file')
เพื่อเรียกใช้ use:f.rewind; eval f.readlines.join("\n");
eval(File.read ...)
ส่วนนี้อีกต่อไป Rails ยอมรับไฟล์ Ruby เป็นอาร์กิวเมนต์ของrails runner
:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
rails r path/to/filename.rb
จะใช้งานได้เทียบเท่ากับbundle exec rails runner
คำสั่งที่กล่าวถึงข้างต้น
ในระหว่างนี้โซลูชันนี้ได้รับการสนับสนุน
rails r PATH_TO_RUBY_FILE
ง่ายกว่ามากในตอนนี้
script/console --irb=pry < test.rb > test.log
ง่ายสกปรกและปิดกั้นกระบวนการในตอนท้าย แต่มันทำงานได้อย่างที่ฉันต้องการ
พิจารณาสร้างงานคราด
สำหรับรหัสที่ฉันต้องการสร้างระเบียนหรือสนับสนุนการย้ายข้อมูลเช่นฉันมักจะสร้างงานคราดเช่นนั้นจากคำตอบนี้ ตัวอย่างเช่น:
ในlib/tasks/example.rake
:
namespace :example do
desc "Sample description you'd see if you ran: 'rake --tasks' in the terminal"
task create_user: :environment do
User.create! first_name: "Foo", last_name: "Bar"
end
end
จากนั้นในเทอร์มินัลให้รัน:
rake example:create_user
จากแนวทางเหล่านี้ที่กล่าวถึงก่อนหน้านี้ไม่มีอะไรที่ดูสะอาดและเหมาะอย่างที่คุณคาดหวังให้สคริปต์แบบสแตนด์อโลนทำงาน (ไม่ได้รับการประเมินหรือส่งผ่าน <การเปลี่ยนเส้นทาง) แต่ในที่สุดวิธีนี้ก็ใช้ได้ผลสำหรับฉัน:
(สำหรับ Rails 3)
แทรกที่ด้านบนสุดของสคริปต์ของคุณ:
#!/usr/bin/env ruby
APP_PATH = File.expand_path(appdir = '/srv/staging/strat/fundmgr/config/application', __FILE__)
require File.expand_path(appdir + '/../boot', __FILE__)
require APP_PATH
# set Rails.env here if desired
Rails.application.require_environment!
# your code here...
แน่นอนตั้งค่าเส้นทางแอพ Rails ของคุณเองในบรรทัด APP_PATH
ด้วยวิธีนี้ฉันสามารถหลีกเลี่ยงการป้อนแบบโต้ตอบใด ๆirb
หรือrails c
และสามารถทดสอบscript.rbของฉันจากเชลล์พร้อมต์ก่อนเช่น กำหนดเวลาใน crontab
รองรับพารามิเตอร์บรรทัดคำสั่งได้อย่างราบรื่นและลดระดับของ Wrapper ก่อนที่จะไปที่โค้ดของคุณ
CREDIT (แสดงตัวอย่าง Rails 2 ด้วย)
http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html
นี่คือแฮ็คที่ฉันใช้:
rr() {
rails_root="$(bundle exec rails runner "puts Rails.root")"
rp="$(relpath "$1" "$rails_root")"
bundle exec rails runner "eval(File.read '$rp')"
}
relpath() {python -c "import os.path; print os.path.relpath('$1','${2:-$PWD}')";}
ตัวอย่าง:
cd ~/rails_project/app/helpers
rr my_script.rb
อ้างอิงจากคำตอบของ @ moritz ที่นี่ ฉันเปลี่ยนมันเนื่องจากไดเร็กทอรีการทำงานสำหรับFile.read
คือรูทโปรเจ็กต์ Rails
ฉันรู้ว่านี่เป็นเรื่องนอกรีตที่ร้ายแรงโดยใช้ python เพื่อช่วยสคริปต์ทับทิม แต่ฉันไม่พบrelpath
วิธีการที่สร้างขึ้นในทับทิม
เครดิต: relpath()
ถูกนำมาจาก @MestreLion แปลงเส้นทางสัมบูรณ์เป็นเส้นทางสัมพัทธ์ที่กำหนดไดเรกทอรีปัจจุบันโดยใช้ Bash