Как запустить файл Ruby в среде Rails?

107

Я хочу запустить файл Ruby в контексте среды Rails. rails runner почти делает то, что я хочу, но я хотел бы просто дать ему имя файла и аргументы. Я почти уверен, что это возможно, поскольку я делал это раньше. Может кто-нибудь напомнить, как это сделать?

Weicool
источник

Ответы:

37

Просто environment.rbукажите в своем скрипте. Если ваш скрипт находится в scriptкаталоге вашего приложения Rails, выполните

require File.expand_path('../../config/environment', __FILE__)

Вы можете контролировать используемую среду (разработка / тестирование / производство), задав RAILS_ENVпеременную среды при запуске скрипта.

RAILS_ENV=production ruby script/test.rb
iltempo
источник
Если я запустил вышеуказанный код, он выдаст «home / apps / config / environment». Что делать, если у меня в одном каталоге запущено 2 приложения rails. Какая среда потребуется? Я столкнулся с этой проблемой в своем локальном ящике. любезно предлагаю
Виджай Сали
@VijaySali Я предполагаю, что вы запускаете свой скрипт из app/scriptкаталога. Файл среды будет взят из отдельного приложения.
iltempo
да, спасибо, у меня это сработало, я также добавил ENV ['RAILS_ENV']
Виджай Сали
26

Runner запускает код Ruby в контексте Rails в неинтерактивном режиме.

Из rails runnerкоманды:

Usage: runner [options] ('Some.ruby(code)' or a filename)

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

Вы также можете использовать runner в качестве строки shebang для своих скриптов, например:

-------------------------------------------------------------
#!/usr/bin/env /Users/me/rails_project/script/rails runner

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
Colsen
источник
1
Почему это работает только тогда, когда я указываю «/ Users / me / rails_project / script / rails» полностью, а не только «rails»? TIA
iphone007
Требуется ли для других ваших команд rails также указать полный путь? (т.е. сервер рельсов)
Colsen
@ iphone007 может зависеть от того, откуда вы запускаете скрипт.
Дэвид Моулс
7

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

В 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

Локально это будет выполняться в контексте вашей базы данных разработки, а если оно запущено на Heroku, оно будет запущено при подключении к вашей производственной базе данных. Я считаю это особенно полезным при переносе или изменении таблиц.

Мэтт
источник