1 Uso
Para aplicar um modelo, você precisa fornecer ao gerador do Rails a localização do modelo que deseja aplicar usando a opção -m
. Isso pode ser um caminho para um arquivo ou uma URL.
$ rails new blog -m ~/template.rb
$ rails new blog -m http://example.com/template.rb
Você pode usar o comando app:template
do Rails para aplicar modelos a um aplicativo Rails existente. A localização do modelo precisa ser passada via variável de ambiente LOCATION. Novamente, isso pode ser um caminho para um arquivo ou uma URL.
$ bin/rails app:template LOCATION=~/template.rb
$ bin/rails app:template LOCATION=http://example.com/template.rb
2 API de Modelo
A API de modelos do Rails é fácil de entender. Aqui está um exemplo de um modelo típico do Rails:
# template.rb
generate(:scaffold, "person name:string")
route "root to: 'people#index'"
rails_command("db:migrate")
after_bundle do
git :init
git add: "."
git commit: %Q{ -m 'Initial commit' }
end
As seções a seguir descrevem os principais métodos fornecidos pela API:
2.1 gem(*args)
Adiciona uma entrada gem
para a gem fornecida ao Gemfile
do aplicativo gerado.
Por exemplo, se seu aplicativo depende das gems bj
e nokogiri
:
gem "bj"
gem "nokogiri"
Observe que este método apenas adiciona a gem ao Gemfile
; ele não instala a gem.
2.2 gem_group(*names, &block)
Envolve as entradas de gem em um grupo.
Por exemplo, se você deseja carregar o rspec-rails
apenas nos grupos development
e test
:
gem_group :development, :test do
gem "rspec-rails"
end
2.3 add_source(source, options={}, &block)
Adiciona a origem fornecida ao Gemfile
do aplicativo gerado.
Por exemplo, se você precisa obter uma gem de "http://gems.github.com"
:
add_source "http://gems.github.com"
Se um bloco for fornecido, as entradas de gem no bloco serão envolvidas no grupo de origem.
add_source "http://gems.github.com/" do
gem "rspec-rails"
end
2.4 environment/application(data=nil, options={}, &block)
Adiciona uma linha dentro da classe Application
para config/application.rb
.
Se options[:env]
for especificado, a linha será adicionada ao arquivo correspondente em config/environments
.
environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'
Um bloco pode ser usado no lugar do argumento data
.
2.5 vendor/lib/file/initializer(filename, data = nil, &block)
Adiciona um inicializador ao diretório config/initializers
do aplicativo gerado.
Digamos que você goste de usar Object#not_nil?
e Object#not_blank?
:
initializer 'bloatlol.rb', <<-CODE
class Object
def not_nil?
!nil?
end
def not_blank?
!blank?
end
end
CODE
Da mesma forma, lib()
cria um arquivo no diretório lib/
e vendor()
cria um arquivo no diretório vendor/
.
Há até mesmo file()
, que aceita um caminho relativo a partir de Rails.root
e cria todos os diretórios/arquivos necessários:
file 'app/components/foo.rb', <<-CODE
class Foo
end
CODE
Isso criará o diretório app/components
e colocará foo.rb
lá dentro.
2.6 rakefile(filename, data = nil, &block)
Cria um novo arquivo rake em lib/tasks
com as tarefas fornecidas:
rakefile("bootstrap.rake") do
<<-TASK
namespace :boot do
task :strap do
puts "i like boots!"
end
end
TASK
end
O exemplo acima cria lib/tasks/bootstrap.rake
com uma tarefa rake boot:strap
.
2.7 generate(what, *args)
Executa o gerador do Rails fornecido com os argumentos dados.
generate(:scaffold, "person", "name:string", "address:text", "age:number")
2.8 run(command)
Executa um comando arbitrário. Assim como as crases. Digamos que você queira remover o arquivo README.rdoc
:
run "rm README.rdoc"
2.9 rails_command(command, options = {})
Executa o comando fornecido no aplicativo Rails. Digamos que você queira migrar o banco de dados:
rails_command "db:migrate"
Você também pode executar comandos com um ambiente Rails diferente:
rails_command "db:migrate", env: 'production'
Você também pode executar comandos como um superusuário:
rails_command "log:clear", sudo: true
Você também pode executar comandos que devem abortar a geração do aplicativo se falharem:
rails_command "db:migrate", abort_on_failure: true
2.10 route(routing_code)
Adiciona uma entrada de roteamento ao arquivo config/routes.rb
. Nos passos acima, geramos um scaffold de pessoa e também removemos o README.rdoc
. Agora, para tornar PeopleController#index
a página padrão do aplicativo:
route "root to: 'person#index'"
2.11 inside(dir)
Permite executar um comando a partir do diretório fornecido. Por exemplo, se você tiver uma cópia do Rails edge que deseja criar um link simbólico a partir de seus novos aplicativos, você pode fazer isso:
ruby
dentro('vendor') do
execute "ln -s ~/commit-rails/rails rails"
end
2.12 pergunte(pergunta)
pergunte()
dá a você a chance de obter algum feedback do usuário e usá-lo em seus modelos. Digamos que você queira que o usuário dê um nome para a nova biblioteca brilhante que você está adicionando:
nome_biblioteca = pergunte("Como você quer chamar a biblioteca brilhante?")
nome_biblioteca << ".rb" unless nome_biblioteca.index(".rb")
biblioteca nome_biblioteca, <<-CODIGO
class Brilhante
end
CODIGO
2.13 sim?(pergunta) ou nao?(pergunta)
Esses métodos permitem que você faça perguntas nos modelos e decida o fluxo com base na resposta do usuário. Digamos que você queira perguntar ao usuário se ele deseja executar as migrações:
comando_rails("db:migrate") if sim?("Executar migrações do banco de dados?")
# nao?(pergunta) age exatamente o oposto.
2.14 git(:comando)
Os modelos do Rails permitem que você execute qualquer comando git:
git :init
git add: "."
git commit: "-a -m 'Commit inicial'"
2.15 after_bundle(&block)
Registra um retorno de chamada a ser executado após as gemas serem agrupadas e os binstubs serem gerados. Útil para adicionar arquivos gerados ao controle de versão:
after_bundle do
git :init
git add: '.'
git commit: "-a -m 'Commit inicial'"
end
Os retornos de chamada são executados mesmo se --skip-bundle
for passado.
3 Uso Avançado
O modelo de aplicativo é avaliado no contexto de uma instância de Rails::Generators::AppGenerator
. Ele usa a ação apply
fornecida pelo Thor.
Isso significa que você pode estender e alterar a instância para atender às suas necessidades.
Por exemplo, sobrescrevendo o método source_paths
para conter a localização do seu modelo. Agora, métodos como copy_file
aceitarão caminhos relativos à localização do seu modelo.
def source_paths
[__dir__]
end
Feedback
Você é incentivado a ajudar a melhorar a qualidade deste guia.
Por favor, contribua se encontrar algum erro de digitação ou factual. Para começar, você pode ler nossa contribuição à documentação seção.
Você também pode encontrar conteúdo incompleto ou desatualizado. Por favor, adicione qualquer documentação ausente para o principal. Certifique-se de verificar Guias Edge primeiro para verificar se os problemas já foram corrigidos ou não no branch principal. Verifique as Diretrizes dos Guias do Ruby on Rails para estilo e convenções.
Se por algum motivo você encontrar algo para corrigir, mas não puder corrigi-lo você mesmo, por favor abra uma issue.
E por último, mas não menos importante, qualquer tipo de discussão sobre a documentação do Ruby on Rails é muito bem-vinda no Fórum oficial do Ruby on Rails.