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ń.


Odpowiedzi:


166

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

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

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.


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


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.


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

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.