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


Respostas:


166

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

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

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.


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


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.


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

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.