Berikan file skrip ruby ​​ke konsol rel


Jawaban:


166

Sebenarnya, cara termudah adalah menjalankannya dengan loaddi dalamrails console

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

5
Ini bekerja dengan baik. Tetapi kecuali saya melakukan sesuatu yang salah, Anda tidak memiliki akses ke objek yang dibuat di dalam skrip. Ada cara untuk melakukan itu? Kasus penggunaannya adalah menyiapkan beberapa objek, lalu menjelajahinya secara interaktif. Apakah itu mungkin?
Dan Barron

1
@DanBarron Anda dapat memasukkan debugger atau binding.pry
hibah

Ini seperti Lisp REPL +1
zeitue

Bantuan noob: ./path - adalah jalur yang berhubungan dengan proyek rails tempat file Anda berada.
Darpan

87

Kamu bisa memakai

bundle exec rails runner "eval(File.read 'your_script.rb')"

MEMPERBARUI:

Apa yang juga sering kami gunakan akhir-akhir ini adalah memuat lingkungan rel dari dalam skrip itu sendiri. Pertimbangkan doit.rb:

#!/usr/bin/env ruby

require "/path/to/rails_app/config/environment"

# ... do your stuff

Ini juga berfungsi jika skrip atau direktori kerja saat ini tidak ada di dalam direktori aplikasi rails.


Terima kasih banyak yang berhasil! Saya menggunakan Sublime Text 2 jadi sekarang saya akan dapat memicu build kelas rel dan melihat output langsung di IDE :)
Haris Krajina

2
script / runner "eval (File.read 'your_script.rb')" untuk rails 2.3 :)
valk

2
Anda dapat menggunakan pola yang sama untuk menjalankan file di dalam konsol: f=File.new('path/to/file')untuk menjalankan gunakan:f.rewind; eval f.readlines.join("\n");
semiomant

3
FYI Anda tidak membutuhkan eval(File.read ...)bagian itu lagi. Rails menerima file Ruby sebagai argumen untuk rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

Perbarui- sesuai jawaban @ HarisKrajina di bawah, sepertinya rails r path/to/filename.rbsecara fungsional setara dengan bundle exec rails runnerperintah yang disebutkan di atas.
Richie Thomas


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

sederhana, kotor, dan memblokir proses di bagian akhir, tetapi melakukan pekerjaan persis seperti yang saya inginkan.


4

Pertimbangkan untuk membuat tugas menyapu.

Untuk kode yang saya perlukan untuk membuat catatan atau mendukung migrasi, misalnya, saya sering membuat tugas menyapu seperti itu dari jawaban ini . Sebagai contoh:

Masuk 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

Dan kemudian di terminal jalankan:

rake example:create_user

1

Dari pendekatan yang disebutkan sebelumnya, tidak ada yang tampak bersih dan ideal seperti yang Anda harapkan untuk menjalankan skrip mandiri (tidak dievaluasi atau disalurkan melalui <redirection), tetapi akhirnya ini berfungsi sempurna untuk saya:

(untuk Rails 3)

Sisipkan di bagian atas skrip Anda:

#!/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...

Tentu saja, setel jalur aplikasi Rails Anda sendiri di baris APP_PATH.

Dengan cara itu, saya dapat menghindari keharusan untuk memasukkan apapun yang interaktif irbatau rails cdan dapat menguji script.rb saya dari prompt shell, sebelumnya misalnya. menjadwalkannya di crontab.

Ini dengan lancar mendukung parameter baris perintah, juga, dan meminimalkan tingkat pembungkus sebelum mendapatkan kode Anda.

CREDIT (juga menunjukkan contoh Rails 2)

http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html


0

Inilah retasan yang saya gunakan:

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}')";}

Contoh:

cd ~/rails_project/app/helpers
rr my_script.rb

Berdasarkan jawaban @ moritz di sini. Saya mengubahnya, karena direktori kerja untuk File.readadalah root proyek Rails.

Saya tahu ini adalah bid'ah yang serius, menggunakan python untuk membantu skrip ruby. Tetapi saya tidak dapat menemukan relpathmetode yang dibangun ke dalam ruby.

Kredit: relpath()diambil dari @MestreLion, Ubah jalur absolut menjadi jalur relatif berdasarkan direktori saat ini menggunakan Bash

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.