Przekaż plik skryptu ruby ​​do konsoli railsów

117

Czy istnieje sposób na przekazanie pliku ruby, foo.rb do konsoli railsów . Oczekiwane rezultaty nastąpią po uruchomieniu przez konsolę środowiska railsów w celu uruchomienia pliku.

Lub w jakikolwiek inny sposób, który pozwoliłby mi uruchomić plik w środowisku railsowym, uruchamiany z wiersza poleceń.

Haris Krajina
źródło

Odpowiedzi:

166

Właściwie najprostszym sposobem jest uruchomienie go z loadwewnątrzrails console

 load './path/to/foo.rb'
Adrian
źródło
5
To działa świetnie. Ale jeśli nie robię czegoś źle, nie masz dostępu do obiektów utworzonych w skrypcie. Jakiś sposób to zrobić? Przykładem użycia jest ustawienie niektórych obiektów, a następnie interaktywna eksploracja. Czy to jest możliwe?
Dan Barron
1
@DanBarron możesz wstawić debugger lub bindowanie. Pry
udziel
To jest jak Lisp REPL +1
zeitue
Pomoc Nooba: ./path - jest ścieżką zależną od projektu rails, w którym znajduje się plik.
Darpan
87

Możesz użyć

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

AKTUALIZACJA:

To, czego ostatnio używamy, to ładowanie środowiska railsów z poziomu samego skryptu. Rozważ doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Działa to również, jeśli skrypt lub bieżący katalog roboczy nie znajdują się w katalogu aplikacji railsowej.

Moritz
źródło
Wielkie dzięki, że działa! Używam Sublime Text 2, więc teraz będę mógł wyzwalać kompilacje klas railsów i wyświetlać dane wyjściowe bezpośrednio w IDE :)
Haris Krajina
2
script / runner "eval (File.read 'your_script.rb')" dla rails 2.3 :)
valk
2
możesz użyć podobnego wzorca do uruchamiania plików w konsoli: f=File.new('path/to/file')do uruchomienia użyj:f.rewind; eval f.readlines.join("\n");
semiomant
3
FYI, nie potrzebujesz eval(File.read ...)już tej części. Railsy akceptują plik Ruby jako argument do rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32,
Aktualizacja - zgodnie z odpowiedzią @ HarisKrajina poniżej, wygląda na rails r path/to/filename.rbto , że jest funkcjonalnym odpowiednikiem powyższego bundle exec rails runnerpolecenia.
Richie Thomas
61

W międzyczasie to rozwiązanie było obsługiwane.

rails r PATH_TO_RUBY_FILE

Teraz dużo prostsze.

Haris Krajina
źródło
w jakich wersjach Railsów?
karatedog
1
Myślę, że 3+, mogę potwierdzić na 5.
Haris Krajina
4
script/console --irb=pry < test.rb > test.log

prosty, brudny i blokuje proces na końcu, ale działa dokładnie tak, jak chciałem.

hari seldon
źródło
4

Rozważ utworzenie zadania prowizji.

Na przykład dla kodu, którego potrzebuję do tworzenia rekordów lub obsługi migracji, często tworzę zadanie prowizji na podstawie tej odpowiedzi . Na przykład:

W 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

A potem w terminalu uruchom:

rake example:create_user
Matt
źródło
1

Z tych podejść wspomnianych wcześniej, żadne nie wydawało się czyste i idealne, jak można by oczekiwać, że samodzielny skrypt będzie działał (nie zostanie poddany ewaluacji ani potokiem przez <przekierowanie), ale w końcu działa to idealnie dla mnie:

(dla szyn 3)

Wstaw na górze skryptu:

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

Oczywiście ustaw własną ścieżkę do aplikacji Railsów w linii APP_PATH.

W ten sposób mogę uniknąć konieczności wprowadzania jakichkolwiek interaktywnych irblub rails ci mogę przetestować mój skrypt.rb z poziomu zachęty powłoki, zanim np. planowanie w crontab.

Płynnie obsługuje również parametry wiersza poleceń i minimalizuje poziomy opakowań przed przejściem do kodu.

KREDYT (pokazuje również przykład Rails 2)

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

Marcos
źródło
0

Oto hack, którego używam:

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

Przykład:

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

Na podstawie odpowiedzi @ moritz tutaj. Zmieniłem to, ponieważ katalog roboczy dla File.readjest katalogiem głównym projektu Rails.

Wiem, że to poważna herezja, polegająca na używaniu Pythona do pomocy skryptowi rubinowemu. Ale nie mogłem znaleźć relpathmetody wbudowanej w rubin.

Kredyt: relpath()został wzięty z @MestreLion, Konwertuj ścieżkę bezwzględną na ścieżkę względną podając bieżący katalog za pomocą Bash

Chaim Leib Halbert
źródło