ส่งไฟล์สคริปต์ทับทิมไปยังคอนโซลราง


117

มีวิธีส่งไฟล์ Ruby, foo.rbไปยังคอนโซลราง ผลลัพธ์ที่คาดไว้จะเกิดขึ้นหลังจากคอนโซลเริ่มสภาพแวดล้อมรางเพื่อเรียกใช้ไฟล์

หรือวิธีอื่นใดที่จะทำให้ฉันสามารถเรียกใช้ไฟล์ในสภาพแวดล้อมทางรถไฟที่เรียกใช้จากพรอมต์คำสั่ง


คำตอบ:


166

จริงๆแล้ววิธีที่ง่ายที่สุดคือเรียกใช้โดยloadภายในไฟล์rails console

 load './path/to/foo.rb'

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

1
@ DanBarron คุณสามารถใส่ debugger หรือ binding.pry
ให้สิทธิ์

นี่ก็เหมือนกับ Lisp REPL +1
zeitue

Noob help: ./path - เป็นเส้นทางที่สัมพันธ์กับโครงการรางของคุณที่ไฟล์ของคุณอยู่
Darpan

87

คุณสามารถใช้ได้

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


ขอบคุณมากที่ได้งาน! ฉันใช้ Sublime Text 2 ดังนั้นตอนนี้ฉันจะสามารถเรียกสร้างคลาสรางและดูเอาต์พุตได้โดยตรงใน IDE :)
Haris Krajina

2
script / runner "eval (File.read 'your_script.rb')" สำหรับราง 2.3 :)
valk

2
คุณสามารถใช้รูปแบบที่คล้ายกันในการเรียกใช้ไฟล์ภายในคอนโซลf=File.new('path/to/file')เพื่อเรียกใช้ use:f.rewind; eval f.readlines.join("\n");
semiomant

3
FYI คุณไม่ต้องการeval(File.read ...)ส่วนนี้อีกต่อไป Rails ยอมรับไฟล์ Ruby เป็นอาร์กิวเมนต์ของrails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

อัปเดต - ตามคำตอบของ @ HarisKrajina ด้านล่างดูเหมือนว่าrails r path/to/filename.rbจะใช้งานได้เทียบเท่ากับbundle exec rails runnerคำสั่งที่กล่าวถึงข้างต้น
Richie Thomas

61

ในระหว่างนี้โซลูชันนี้ได้รับการสนับสนุน

rails r PATH_TO_RUBY_FILE

ง่ายกว่ามากในตอนนี้


Rails เวอร์ชันใด
karatedog

1
ฉันคิดว่า 3+ ฉันสามารถยืนยันได้สำหรับ 5.
Haris Krajina

4
script/console --irb=pry < test.rb > test.log

ง่ายสกปรกและปิดกั้นกระบวนการในตอนท้าย แต่มันทำงานได้อย่างที่ฉันต้องการ


4

พิจารณาสร้างงานคราด

สำหรับรหัสที่ฉันต้องการสร้างระเบียนหรือสนับสนุนการย้ายข้อมูลเช่นฉันมักจะสร้างงานคราดเช่นนั้นจากคำตอบนี้ ตัวอย่างเช่น:

ใน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

1

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

(สำหรับ 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


0

นี่คือแฮ็คที่ฉันใช้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.