Passe o arquivo de script ruby ​​para o console do Rails

117

Existe uma maneira de passar o arquivo ruby, foo.rb para o console do Rails. Os resultados esperados seriam após o console iniciar o ambiente Rails para executar o arquivo.

Ou qualquer outra forma que me permitisse executar arquivo em ambiente rails, disparado do prompt de comando.

Haris Krajina
fonte

Respostas:

166

Na verdade, a maneira mais simples é executá-lo loaddentro dorails console

 load './path/to/foo.rb'
Adrian
fonte
5
Isso funciona muito bem. Mas, a menos que eu esteja fazendo algo errado, você não tem acesso aos objetos criados dentro do script. Alguma maneira de fazer isso? O caso de uso é configurar alguns objetos e explorá-los interativamente. Isso é possível?
Dan Barron
1
@DanBarron, você pode colocar um depurador ou binding.pry
conceder
É como um Lisp REPL +1
zeitue
Noob help: ./path - é o caminho relativo ao seu projeto Rails onde seu arquivo reside.
Darpan
87

Você pode usar

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

ATUALIZAR:

O que também temos usado muito ultimamente é carregar o ambiente Rails de dentro do próprio script. Considere doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Isso também funciona se o script ou o diretório de trabalho atual não estiver dentro do diretório do aplicativo Rails.

Moritz
fonte
Muito obrigado, isso faz um trabalho! Estou usando Sublime Text 2, então agora poderei acionar builds de classes Rails e ver a saída diretamente no IDE :)
Haris Krajina
2
script / runner "eval (File.read 'your_script.rb')" para rails 2.3 :)
valk
2
você pode usar um padrão semelhante para executar arquivos dentro do console: f=File.new('path/to/file')para executar use:f.rewind; eval f.readlines.join("\n");
semiomant
3
Para sua informação, você não precisa mais da eval(File.read ...)peça. Rails aceita um arquivo Ruby como um argumento para rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32
Update- de acordo com a resposta de @HarisKrajina abaixo, parece que rails r path/to/filename.rbé funcionalmente equivalente ao bundle exec rails runnercomando mencionado acima.
Richie Thomas
61

Entretanto, esta solução foi suportada.

rails r PATH_TO_RUBY_FILE

Muito mais simples agora.

Haris Krajina
fonte
em quais versões do Rails?
Karatedog
1
Acho que 3+, posso confirmar para 5.
Haris Krajina
4
script/console --irb=pry < test.rb > test.log

simples, sujo e bloqueia o processo no final, mas faz o trabalho exatamente como eu queria.

hari seldon
fonte
4

Considere a criação de uma tarefa de rake.

Para código que preciso criar registros ou oferecer suporte a migrações, por exemplo, geralmente crio uma tarefa rake como essa a partir desta resposta . Por exemplo:

Em 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

E então, no terminal, execute:

rake example:create_user
Matt
fonte
1

Dessas abordagens mencionadas anteriormente, nenhuma parecia limpa e ideal como você esperaria que um script autônomo fosse executado (não foi avaliado ou canalizado por meio de <redirecionamento), mas finalmente isso funciona perfeitamente para mim:

(para Rails 3)

Insira no topo do seu 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...

Claro, defina seu próprio caminho de aplicativo Rails na linha APP_PATH.

Dessa forma, posso evitar ter que entrar em qualquer interativo irbou rails ce posso testar meu script.rb no prompt do shell, antes, por exemplo. agendá-lo no crontab.

Suporta também parâmetros de linha de comando sem problemas e minimiza os níveis de wrappers antes de chegar ao seu código.

CRÉDITO (também mostra um exemplo do Rails 2)

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

Marcos
fonte
0

Este é o hack que estou usando:

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}')";}

Exemplo:

cd ~/rails_project/app/helpers
rr my_script.rb

Com base na resposta de @ moritz aqui. Eu mudei, já que o diretório de trabalho para File.readé a raiz do projeto Rails.

Eu sei que isso é uma heresia séria, usar python para ajudar um script ruby. Mas não consegui encontrar um relpathmétodo integrado ao ruby.

Crédito: relpath()foi tirado de @MestreLion, converter caminho absoluto em caminho relativo dado um diretório atual usando Bash

Chaim Leib Halbert
fonte