Passa il file dello script ruby ​​alla console di rails


Risposte:


166

In realtà, il modo più semplice è eseguirlo loadall'interno dirails console

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

5
Funziona alla grande. Ma a meno che io non stia facendo qualcosa di sbagliato, non hai accesso agli oggetti creati all'interno dello script. Come posso farlo? Il caso d'uso è impostare alcuni oggetti, quindi esplorarli in modo interattivo. È possibile?
Dan Barron

1
@DanBarron puoi inserire un debugger o binding.pry
concedi il

Questo è proprio come un Lisp REPL +1
zeitue

Noob help: ./path - è il percorso relativo al tuo progetto rails dove risiede il tuo file.
Darpan

87

Puoi usare

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

AGGIORNARE:

Quello che abbiamo anche usato molto ultimamente è caricare l'ambiente rails dall'interno dello script stesso. Considera doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Funziona anche se lo script o la directory di lavoro corrente non si trovano nella directory dell'app rails.


Grazie mille che fa un lavoro! Sto usando Sublime Text 2 quindi ora sarò in grado di attivare build di classi rails e vedere l'output direttamente in IDE :)
Haris Krajina

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

2
puoi usare un modello simile per eseguire file all'interno della console: f=File.new('path/to/file')per eseguire usa:f.rewind; eval f.readlines.join("\n");
semiomant

3
Cordiali saluti, non hai più bisogno della eval(File.read ...)parte. Rails accetta un file Ruby come argomento per rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

Aggiornamento: secondo la risposta di @ HarisKrajina di seguito, sembra rails r path/to/filename.rbfunzionalmente equivalente al bundle exec rails runnercomando menzionato sopra.
Richie Thomas

61

Nel frattempo, questa soluzione è stata supportata.

rails r PATH_TO_RUBY_FILE

Ora è molto più semplice.


in quali versioni di Rails?
karatedog

1
Penso 3+, posso confermare per 5.
Haris Krajina

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

semplice, sporco e blocca il processo alla fine, ma fa esattamente il lavoro come volevo.


4

Considera l'idea di creare un'attività di rake.

Per il codice di cui ho bisogno per creare record o supportare migrazioni, ad esempio, creo spesso un'attività di rake come quella da questa risposta . Per esempio:

In 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

E poi nel terminale esegui:

rake example:create_user

1

Di questi approcci menzionati in precedenza, nessuno sembrava pulito e ideale come ci si aspetterebbe che venga eseguito uno script autonomo (non viene valutato o reindirizzato tramite <reindirizzamento), ma alla fine questo funziona perfettamente per me:

(per Rails 3)

Inserisci nella parte superiore del tuo script:

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

Ovviamente, imposta il percorso dell'app Rails nella riga APP_PATH.

In questo modo, posso evitare di dover inserire qualsiasi interattivo irbo rails ce posso testare il mio script.rb dal prompt della shell, prima ad es. pianificandolo in crontab.

Supporta senza problemi anche i parametri della riga di comando e riduce al minimo i livelli di wrapper prima di arrivare al codice.

CREDITO (mostra anche un esempio di Rails 2)

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


0

Ecco l'hack che sto usando:

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

Esempio:

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

Basato sulla risposta di @ moritz qui. L'ho cambiato, poiché la directory di lavoro per File.readè la root del progetto Rails.

So che questa è una seria eresia, usare Python per aiutare uno script Ruby. Ma non sono riuscito a trovare un relpathmetodo integrato in Ruby.

Credito: è relpath()stato preso da @MestreLion, Converti percorso assoluto in percorso relativo data una directory corrente utilizzando Bash

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.