edge
Mais em rubyonrails.org: Mais Ruby on Rails

Modelos de Aplicativos Rails

Os modelos de aplicativos são arquivos Ruby simples contendo DSL para adicionar gems, inicializadores, etc. ao seu projeto Rails recém-criado ou a um projeto Rails existente.

Depois de ler este guia, você saberá:

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.