edge
Plus sur rubyonrails.org: Plus de Ruby on Rails

Modèles d'application Rails

Les modèles d'application sont de simples fichiers Ruby contenant un DSL pour ajouter des gems, des initializers, etc. à votre projet Rails fraîchement créé ou à un projet Rails existant.

Après avoir lu ce guide, vous saurez :

1 Utilisation

Pour appliquer un modèle, vous devez fournir au générateur Rails l'emplacement du modèle que vous souhaitez appliquer en utilisant l'option -m. Il peut s'agir soit d'un chemin vers un fichier, soit d'une URL.

$ rails new blog -m ~/template.rb
$ rails new blog -m http://example.com/template.rb

Vous pouvez utiliser la commande app:template de Rails pour appliquer des modèles à une application Rails existante. L'emplacement du modèle doit être passé via la variable d'environnement LOCATION. Encore une fois, il peut s'agir soit d'un chemin vers un fichier, soit d'une URL.

$ bin/rails app:template LOCATION=~/template.rb
$ bin/rails app:template LOCATION=http://example.com/template.rb

2 API de modèle

L'API de modèles Rails est facile à comprendre. Voici un exemple d'un modèle Rails typique :

# 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

Les sections suivantes décrivent les principales méthodes fournies par l'API :

2.1 gem(*args)

Ajoute une entrée gem pour la gem fournie au Gemfile de l'application générée.

Par exemple, si votre application dépend des gems bj et nokogiri :

gem "bj"
gem "nokogiri"

Notez que cette méthode ajoute uniquement la gem au Gemfile ; elle n'installe pas la gem.

2.2 gem_group(*names, &block)

Enveloppe les entrées de gem dans un groupe.

Par exemple, si vous voulez charger rspec-rails uniquement dans les groupes development et test :

gem_group :development, :test do
  gem "rspec-rails"
end

2.3 add_source(source, options={}, &block)

Ajoute la source donnée au Gemfile de l'application générée.

Par exemple, si vous avez besoin de sourcer une gem depuis "http://gems.github.com" :

add_source "http://gems.github.com"

Si un bloc est donné, les entrées de gem dans le bloc sont enveloppées dans le groupe de source.

add_source "http://gems.github.com/" do
  gem "rspec-rails"
end

2.4 environment/application(data=nil, options={}, &block)

Ajoute une ligne à l'intérieur de la classe Application pour config/application.rb.

Si options[:env] est spécifié, la ligne est ajoutée au fichier correspondant dans config/environments.

environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'

Un bloc peut être utilisé à la place de l'argument data.

2.5 vendor/lib/file/initializer(filename, data = nil, &block)

Ajoute un initializer au répertoire config/initializers de l'application générée.

Disons que vous aimez utiliser Object#not_nil? et Object#not_blank? :

initializer 'bloatlol.rb', <<-CODE
  class Object
    def not_nil?
      !nil?
    end

    def not_blank?
      !blank?
    end
  end
CODE

De même, lib() crée un fichier dans le répertoire lib/ et vendor() crée un fichier dans le répertoire vendor/.

Il y a même file(), qui accepte un chemin relatif à partir de Rails.root et crée tous les répertoires/fichiers nécessaires :

file 'app/components/foo.rb', <<-CODE
  class Foo
  end
CODE

Cela créera le répertoire app/components et y placera foo.rb.

2.6 rakefile(filename, data = nil, &block)

Crée un nouveau fichier rake sous lib/tasks avec les tâches fournies :

rakefile("bootstrap.rake") do
  <<-TASK
    namespace :boot do
      task :strap do
        puts "i like boots!"
      end
    end
  TASK
end

Le code ci-dessus crée lib/tasks/bootstrap.rake avec une tâche rake boot:strap.

2.7 generate(what, *args)

Exécute le générateur Rails fourni avec les arguments donnés.

generate(:scaffold, "person", "name:string", "address:text", "age:number")

2.8 run(command)

Exécute une commande arbitraire. Tout comme les backticks. Disons que vous voulez supprimer le fichier README.rdoc :

run "rm README.rdoc"

2.9 rails_command(command, options = {})

Exécute la commande fournie dans l'application Rails. Disons que vous voulez migrer la base de données :

rails_command "db:migrate"

Vous pouvez également exécuter des commandes avec un environnement Rails différent :

rails_command "db:migrate", env: 'production'

Vous pouvez également exécuter des commandes en tant que super-utilisateur :

rails_command "log:clear", sudo: true

Vous pouvez également exécuter des commandes qui doivent interrompre la génération de l'application en cas d'échec :

rails_command "db:migrate", abort_on_failure: true

2.10 route(routing_code)

Ajoute une entrée de routage au fichier config/routes.rb. Dans les étapes ci-dessus, nous avons généré un scaffold pour une personne et supprimé README.rdoc. Maintenant, pour faire de PeopleController#index la page par défaut de l'application :

route "root to: 'person#index'"

2.11 inside(dir)

Vous permet d'exécuter une commande depuis le répertoire donné. Par exemple, si vous avez une copie de Rails edge que vous souhaitez lier symboliquement à partir de vos nouvelles applications, vous pouvez faire ceci : ruby inside('vendor') do run "ln -s ~/commit-rails/rails rails" end

2.12 ask(question)

ask() vous donne la possibilité d'obtenir des commentaires de l'utilisateur et de les utiliser dans vos modèles. Disons que vous voulez que l'utilisateur donne un nom à la nouvelle bibliothèque brillante que vous ajoutez :

lib_name = ask("Comment voulez-vous appeler la nouvelle bibliothèque brillante ?")
lib_name << ".rb" unless lib_name.index(".rb")

lib lib_name, <<-CODE
  class Shiny
  end
CODE

2.13 yes?(question) ou no?(question)

Ces méthodes vous permettent de poser des questions à partir de modèles et de décider du flux en fonction de la réponse de l'utilisateur. Disons que vous voulez demander à l'utilisateur d'exécuter des migrations :

rails_command("db:migrate") if yes?("Exécuter les migrations de la base de données ?")
# no?(question) agit exactement à l'opposé.

2.14 git(:command)

Les modèles Rails vous permettent d'exécuter n'importe quelle commande git :

git :init
git add: "."
git commit: "-a -m 'Commit initial'"

2.15 after_bundle(&block)

Enregistre un rappel à exécuter après que les gemmes aient été regroupées et que les binstubs aient été générés. Utile pour ajouter des fichiers générés au contrôle de version :

after_bundle do
  git :init
  git add: '.'
  git commit: "-a -m 'Commit initial'"
end

Les rappels sont exécutés même si --skip-bundle a été passé.

3 Utilisation avancée

Le modèle d'application est évalué dans le contexte d'une instance de Rails::Generators::AppGenerator. Il utilise l'action apply fournie par Thor.

Cela signifie que vous pouvez étendre et modifier l'instance pour répondre à vos besoins.

Par exemple, en écrivant la méthode source_paths pour contenir l'emplacement de votre modèle. Maintenant, des méthodes comme copy_file accepteront des chemins relatifs à l'emplacement de votre modèle.

def source_paths
  [__dir__]
end

Retour d'information

Vous êtes encouragé à contribuer à l'amélioration de la qualité de ce guide.

Veuillez contribuer si vous trouvez des fautes de frappe ou des erreurs factuelles. Pour commencer, vous pouvez lire notre contribution à la documentation section.

Vous pouvez également trouver du contenu incomplet ou des informations qui ne sont pas à jour. Veuillez ajouter toute documentation manquante pour la version principale. Assurez-vous de vérifier Edge Guides d'abord pour vérifier si les problèmes ont déjà été résolus ou non sur la branche principale. Consultez les Directives des guides Ruby on Rails pour le style et les conventions.

Si pour une raison quelconque vous repérez quelque chose à corriger mais ne pouvez pas le faire vous-même, veuillez ouvrir un problème.

Et enfin, toute discussion concernant la documentation de Ruby on Rails est la bienvenue sur le Forum officiel de Ruby on Rails.