Ответ 1
Тем временем это решение было поддержано.
rails r PATH_TO_RUBY_FILE
Намного проще.
Есть ли способ передать файл ruby, foo.rb в rails console. Ожидаемые результаты состоят в том, что консоль запускает среду рельсов для запуска файла.
Или любым другим способом, который позволил бы мне выполнить файл в среде rails, вызванный из командной строки.
Тем временем это решение было поддержано.
rails r PATH_TO_RUBY_FILE
Намного проще.
Собственно, самый простой способ - запустить его с помощью load
внутри rails console
load './path/to/foo.rb'
Вы можете использовать
bundle exec rails runner "eval(File.read 'your_script.rb')"
UPDATE:
То, что мы также использовали в последнее время, - это загрузить среду рельсов из самого script. Рассмотрим doit.rb
:
#!/usr/bin/env ruby
require "/path/to/rails_app/config/environment"
# ... do your stuff
script/console --irb=pry < test.rb > test.log
простой, грязный и блокировать процесс в конце, но он выполняет работу точно так, как я хотел.
Из этих подходов, о которых упоминалось ранее, ни один из них не выглядел чистым и идеальным, как вы ожидали бы автономного script для запуска (не получить оценку или передать через < redirection), но, в конце концов, это отлично подходит для меня:
(для Rails 3)
Вставьте вверху вашего script:
#!/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
Здесь я использую hack:
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, чтобы помочь рубину script. Но я не смог найти метод relpath
, встроенный в ruby.
Кредит: relpath()
был взят из @MestreLion, Преобразовать абсолютный путь в относительный путь с учетом текущего каталога с помощью Bash
Рассмотрите возможность создания рейк-задачи.
Для кода, который мне нужен для создания записей или поддержки миграции, например, я часто создаю подобную задачу из этого ответа. Например:
В 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