Ruby on Rails - Échafaudage

Lorsque vous développez des applications Rails, en particulier celles qui vous fournissent principalement une interface simple pour les données d'une base de données, il peut souvent être utile d'utiliser la méthode d'échafaudage.

L'échafaudage offre plus que des sensations de démonstration bon marché. Voici quelques avantages -

  • Vous pouvez rapidement obtenir du code devant vos utilisateurs pour obtenir des commentaires.

  • Vous êtes motivé par un succès plus rapide.

  • Vous pouvez apprendre comment fonctionne Rails en regardant le code généré.

  • Vous pouvez utiliser l'échafaudage comme base pour démarrer votre développement.

Exemple d'échafaudage

Pour comprendre l' échafaudage, créons une base de données appeléecookbook et une table appelée recipes.

Création d'une application Web de rails vides

Ouvrez une fenêtre de commande et accédez à l'endroit où vous souhaitez créer ceci cookbookapplication Web. Alors, exécutez la commande suivante pour créer une structure de répertoires complète.

tp> rails new cookbook

Configuration de la base de données

Voici comment créer une base de données -

mysql> create database cookbook;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on cookbook.*
to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Pour indiquer à Rails comment trouver la base de données, modifiez le fichier de configuration cookbook \ config \ database.yml et remplacez le nom de la base de données par cookbook. Laissez le mot de passe vide. Lorsque vous avez terminé, cela devrait ressembler à ceci -

development:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost
	
test:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost
	
production:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost

Rails vous permet d'exécuter en mode développement, en mode test ou en mode production, en utilisant différentes bases de données. Cette application utilise la même base de données pour chacun.

Le code d'échafaudage généré

Avec l'action d'échafaudage, Rails génère tout le code dont il a besoin de manière dynamique. En exécutant scaffold en tant que script, nous pouvons obtenir tout le code écrit sur le disque, où nous pouvons l'examiner, puis commencer à l'adapter à nos besoins.

Alors maintenant, recommençons pour générer manuellement le code Scaffold en utilisant le script d'aide Scaffold -

cookbook> rails generate scaffold recipe

Il génère des fichiers automatiques comme indiqué ci-dessous -

Le controlle

Regardons le code derrière le contrôleur. Ce code est généré par lescaffoldGénérateur. Si vous ouvrez app / controllers / recettes_controller.rb, vous trouverez quelque chose comme suit -

class RecipesController < ApplicationController
   before_action :set_recipe, only: [:show, :edit, :update, :destroy]
   
   # GET /recipes
   # GET /recipes.json
   def index
      @recipes = Recipe.all
   end
   
   # GET /recipes/1
   # GET /recipes/1.json
   def show
   end
   
   # GET /recipes/new
   def new
      @recipe = Recipe.new
   end
   
   # GET /recipes/1/edit
   def edit
   end
   
   # POST /recipes
   # POST /recipes.json
   def create
      @recipe = Recipe.new(recipe_params)
      
      respond_to do |format|
         if @recipe.save
            format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' }
            format.json { render :show, status: :created, location: @recipe }
         else
            format.html { render :new }
            format.json { render json: @recipe.errors, status: :unprocessable_entity }
         end
      end
      
   end
   
   # PATCH/PUT /recipes/1
   # PATCH/PUT /recipes/1.json
   def update
      respond_to do |format|
         if @recipe.update(recipe_params)
            format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' }
            format.json { render :show, status: :ok, location: @recipe }
         else
            format.html { render :edit }
            format.json { render json: @recipe.errors, status: :unprocessable_entity }
         end
      end
      
   end
   
   # DELETE /recipes/1
   # DELETE /recipes/1.json
   def destroy
      @recipe.destroy
         respond_to do |format|
         format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' }
         format.json { head :no_content }
      end
   end
   
   private
   
   # Use callbacks to share common setup or constraints between actions.
   def set_recipe
      @recipe = Recipe.find(params[:id])
   end
   
   # Never trust parameters from the scary internet, only allow the white list through.
   def recipe_params
      params.require(:recipe).permit(:tittle, :instructions)
   end
end

Lorsque l'utilisateur d'une application Rails sélectionne une action, par exemple "Show" - le contrôleur exécutera n'importe quel code dans la section appropriée - "def show" - et ensuite, par défaut, rendra un modèle du même nom - "show.html. erb ". Ce comportement par défaut peut être écrasé.

Le contrôleur utilise des méthodes ActiveRecord telles que find, find_all, new, save, update_attributes et destroy pour déplacer les données vers et depuis les tables de la base de données. Notez que vous n'avez pas à écrire d'instructions SQL, les rails s'en chargeront automatiquement.

Cette seule ligne de code donnera vie à la table de la base de données. Il fournira une interface simple à vos données et des moyens de -

  • Créer de nouvelles entrées
  • Modifier les entrées actuelles
  • Affichage des entrées actuelles
  • Détruire les entrées actuelles

Lors de la création ou de la modification d'une entrée, scaffold fera tout le travail acharné comme la génération et la gestion de formulaires pour vous, et fournira même une génération de formulaires intelligente, prenant en charge les types d'entrées suivants

  • Chaînes de texte simples
  • Zones de texte (ou grands blocs de texte)
  • Sélecteurs de date
  • Sélecteurs de date et d'heure

Vous pouvez utiliser les migrations Rails pour créer et gérer des tables.

rake db:migrate RAILS_ENV=development

Maintenant, allez dans le répertoire du livre de recettes et exécutez le serveur Web à l'aide de la commande suivante -

cookbook> rails server

Maintenant, ouvrez un navigateur et accédez à http://127.0.0.1:3000/recipe/new.Cela vous fournira un écran pour créer de nouvelles entrées dans le tableau des recettes. Une capture d'écran est présentée ci-dessous -

Une fois que vous appuyez sur Create pour créer une nouvelle recette, votre enregistrement est ajouté dans le tableau des recettes et il affiche le résultat suivant -

Vous pouvez voir l'option pour modifier, afficher et détruire les enregistrements. Alors, jouez avec ces options.

Vous pouvez également lister toutes les recettes disponibles dans le tableau des recettes en utilisant l'URL http://127.0.0.1:3000/recipe/list.

Améliorer le modèle

Rails vous permet de gérer les erreurs gratuitement. Pour comprendre cela, ajoutez quelques règles de validation au modèle de recette vide -

Modifiez app / models / recette.rb comme suit, puis testez votre application -

class Recipe < ActiveRecord::Base
   validates_length_of :title, :within => 1..20
   validates_uniqueness_of :title, :message => "already exists"
end

Ces entrées donneront une vérification automatique.

  • validates_length_of - le champ n'est pas vide et pas trop long.

  • validates_uniqueness_of- les valeurs en double sont piégées. Au lieu du message d'erreur Rails par défaut, nous avons donné ici un message personnalisé.

Autre façon de créer des échafaudages

Créez une application comme indiqué ci-dessus et The Generated Scaffold Code comme indiqué ci-dessous

rails g scaffold Recipe tittle:string instructions:text

Le code ci-dessus génère les fichiers automatiques avec la base de données en utilisant avec sqlite3 avec le titre et la colonne d'instructions comme indiqué ci-dessous une image.

nous devons migrer la base de données en utilisant la syntaxe ci-dessous.

$ rake db:migrate RAILS_ENV=development

Enfin, exécutez l'application en utilisant la ligne de commande suivante -

rails server

Il générera le résultat comme indiqué ci-dessus des images de sortie.

Les vues

Toutes les vues et toutes les méthodes de contrôleur correspondantes sont créées par scaffold command et ils sont disponibles dans le répertoire app / views / recettes.

En quoi l'échafaudage est-il différent?

Si vous avez parcouru les chapitres précédents, vous devez avoir vu que nous avions créé des méthodes pour répertorier, afficher, supprimer et créer des données, etc., mais l'échafaudage fait ce travail automatiquement.