Передать файл сценария ruby ​​в консоль rails

117

Есть ли способ передать файл ruby, foo.rb, в консоль rails. Ожидаемые результаты будут после того, как консоль запустит среду rails для запуска файла.

Или любым другим способом, который позволил бы мне выполнить файл в среде рельсов, запускаемый из командной строки.

Харис Краина
источник
Возможный дубликат Как запустить файл Ruby в среде Rails?
Ник Роз

Ответы:

166

На самом деле, самый простой способ - запустить его loadвнутриrails console

 load './path/to/foo.rb'
Адриан
источник
5
Это прекрасно работает. Но если я не делаю что-то не так, у вас нет доступа к объектам, созданным внутри скрипта. Как это сделать? Вариант использования - настроить некоторые объекты, а затем изучить их в интерактивном режиме. Это возможно?
Дэн Бэррон
1
@DanBarron можно поставить в отладчике или binding.pry
грант
Это похоже на Lisp REPL +1
zeitue
Noob help: ./path - это путь относительно вашего проекта rails, в котором находится ваш файл.
Darpan
87

Ты можешь использовать

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

ОБНОВИТЬ:

В последнее время мы также часто используем загрузку среды rails из самого скрипта. Учтите doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Это также работает, если скрипт или текущий рабочий каталог не находятся в каталоге приложения rails.

Moritz
источник
Большое спасибо, что сделали свою работу! Я использую Sublime Text 2, поэтому теперь я могу запускать сборки классов рельсов и видеть результат прямо в IDE :)
Харис Краина
2
скрипт / бегун "eval (File.read 'your_script.rb')" для rails 2.3 :)
valk
2
вы можете использовать аналогичный шаблон для запуска файлов внутри консоли: f=File.new('path/to/file')для запуска используйте:f.rewind; eval f.readlines.join("\n");
semiomant
3
К вашему сведению, вам больше не нужна эта eval(File.read ...)деталь. Rails принимает файл Ruby в качестве аргумента rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32 06
Обновление - согласно ответу @ HarisKrajina ниже, похоже, rails r path/to/filename.rbфункционально эквивалентно bundle exec rails runnerкоманде, упомянутой выше.
Ричи Томас
61

Пока что это решение было поддержано.

rails r PATH_TO_RUBY_FILE

Теперь намного проще.

Харис Краина
источник
в каких версиях Rails?
karatedog 03
1
Думаю, 3+, могу подтвердить на 5.
Харис Краина
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
Matt
источник
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.

Он также плавно поддерживает параметры командной строки и сводит к минимуму уровни оберток, прежде чем перейти к вашему коду.

КРЕДИТ (также показан пример Rails 2)

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

Marcos
источник
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 для помощи скрипту Ruby. Но я не мог найти relpathметода, встроенного в Ruby.

Кредит: relpath()было взято из @MestreLion, Преобразование абсолютного пути в относительный путь для текущего каталога с помощью Bash

Хаим Лейб Хальберт
источник