2012-04-25 5 views
80

Есть ли способ пройти рубиновый файл, foo.rb to rails console. Ожидаемые результаты состоят в том, что консоль запускает среду рельсов для запуска файла.Pass ruby ​​script file to rails console

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

+0

Возможный дубликат [Как запустить файл на Ruby в среде Rails?] (HTTP: //stackoverflow.com/questions/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) –

ответ

17

В то же время, это решение было поддержано.

rails r PATH_TO_RUBY_FILE 

Гораздо проще сейчас.

72

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

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

UPDATE:

То, что мы также использовали много в последнее время, чтобы загрузить среду рельсы из самого сценария. Рассмотрим doit.rb:

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

Большое спасибо, что делает работу! Я использую Sublime Text 2, так что теперь я смогу запускать сборки классов rails и видеть результат непосредственно в IDE :) –

+2

script/runner "eval (File.read 'your_script.rb')" для rails 2.3 :) – valk

+2

you может использовать аналогичный шаблон для запуска файлов внутри консоли: 'f = File.new ('path/to/file')' для запуска использования: 'f.rewind; eval f.readlines.join ("\ n"); ' – semiomant

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

простой, грязный, и блокировать процесс в конце, но это делает работу так же, как я хотел.

123

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

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

Это отлично работает. Но если я не ошибаюсь, у вас нет доступа к объектам, созданным внутри скрипта. Любой способ сделать это? Вариант использования - это создание некоторых объектов, а затем интерактивное исследование их. Это возможно? –

+0

Так просто. Благодарю. – Abram

+0

@DanBarron вы можете поместить в отладчик или bind.pry – grant

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.

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

CREDIT (также показан пример Rails 2)

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

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 

на основе @ Мориц ответьте здесь. Я изменил его, так как рабочий каталог для File.read - это корень проекта Rails.

Я знаю, что это какая-то серьезная ересь, использующая python, чтобы помочь скрипту ruby. Но я не смог найти метод relpath, встроенный в рубин.

Кредит: relpath() был взят из @MestreLion, Convert absolute path into relative path given a current directory using Bash

1

Рассмотрите возможность создания рейк-задачи.

Для кода, который мне нужен для создания записей или поддержки миграции, например, я часто создаю задачу рейка типа this answer. Например:

В 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 

А потом в терминале выполните команду:

rake example:create_user