Comment faire pour exécuter `rails générer échafaudage` lorsque le modèle existe déjà?

332

Je suis nouveau chez Rails donc mon projet actuel est dans un état bizarre.

L'une des premières choses que j'ai générées a été un modèle "Movie". J'ai ensuite commencé à le définir plus en détail, j'ai ajouté quelques méthodes, etc.

Je réalise maintenant que j'aurais dû le générer avec rails generate scaffold pour connecter des choses comme le routage, les vues, le contrôleur, etc.

J'ai essayé de générer l'échafaudage mais j'ai eu une erreur disant qu'un fichier de migration avec le même nom existe déjà.

Quelle est la meilleure façon pour moi de créer des échafaudages pour mon "film" maintenant? (en utilisant les rails 3)

Lan
la source
1
Il est probablement préférable d'écrire vos propres contrôleurs et vues et itinéraires. Vous en apprendrez plus sur les concepts
Ben Aubin
1
D'accord avec @ penne12. Au moins au début, jusqu'à ce que vous soyez à l'aise avec les concepts, afin que vous sachiez ce que fait tout le code qui est généré pour vous.
mydoghasworms
Pas directement pertinent, mais si vous vous trompez, utilisez des rails pour détruire <etc>. Je me souviens que c'était vraiment utile quand j'ai commencé.
Helsing
1
@BenAubin, bien que vrai, la beauté de Rails est de ne pas avoir à écrire continuellement du passe-partout.
Romuloux

Réponses:

596

TL; DR :rails g scaffold_controller <name>

Même si vous avez déjà un modèle, vous pouvez toujours générer les fichiers de contrôleur et de migration nécessaires en utilisant l' rails generateoption. Si vous exécutez, rails generate -hvous pouvez voir toutes les options disponibles.

Rails:
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  observer
  performance_test
  plugin
  resource
  scaffold
  scaffold_controller
  session_migration
  stylesheets

Si vous souhaitez générer un échafaudage de contrôleur pour votre modèle, voir scaffold_controller. Pour plus de clarté, voici la description à ce sujet:

Arrête un contrôleur échafaudé et ses vues. Passez le nom du modèle, CamelCased ou under_scored, et une liste de vues comme arguments. Le nom du contrôleur est récupéré en tant que version pluralisée du nom du modèle.

Pour créer un contrôleur dans un module, spécifiez le nom du modèle comme chemin d'accès comme «parent_module / controller_name».

Cela génère une classe de contrôleur dans app / controllers et invoque des générateurs d'assistance, de moteur de modèle et de framework de test.

Pour créer votre ressource, vous utiliseriez le resourcegénérateur, et pour créer une migration, vous pouvez également voir le migrationgénérateur (voyez, il y a un modèle à toute cette folie). Ceux-ci fournissent des options pour créer les fichiers manquants pour créer une ressource. Sinon, vous pouvez simplement exécuter rails generate scaffoldavec l' --skipoption pour ignorer tous les fichiers qui existent :)

Je recommande de passer un peu de temps à regarder les options à l'intérieur des générateurs. C'est quelque chose que je ne pense pas être extrêmement bien documenté dans les livres et autres, mais ils sont très pratiques.

Lee Jarvis
la source
12
wow, l'une des meilleures réponses que j'ai jamais eues à une question de programmation. Merci!
Lan
12
J'ai également des modèles existants et faire rails generate scaffold_controller MyModelgénère la couche de vue, mais elle n'inclut pas les attributs du modèle (colonnes de table) et vous devez les ajouter à la main. Quelqu'un connaît un correctif pour cela? Je suis sur Rails 3.2.8.
aaronbartell
@aaronbartell Vous demandez à Rails de générer un 'scaffold_controller' qui ne se soucie pas des attributs du modèle. Ce n'est pas cassé, si vous voulez aussi un modèle généré, alors vous voulez generate scaffoldsi vous avez un modèle mais vous voulez un contrôleur d'échafaudage et de nouveaux attributs ajoutés au modèle que vous voulez scaffold_generatorsuivi par migrationles champs que vous modifiez
Lee Jarvis
9
@Lee - Aucun aaronbartell ne se demande pourquoi le scaffold_controller ne génère pas les entrées de vue correspondantes pour les attributs existants du modèle qui lui a été transmis, ce qui est une question valide ... stackoverflow.com/q/17153864/165673
Yarin
67

Excellente réponse Lee Jarvis, c'est juste la commande par exemple; nous avons déjà un modèle existant appelé Utilisateur:

rails g scaffold_controller User
tokhi
la source
10
Merci pour ceux d'entre nous trop paresseux pour lire des paragraphes de texte!
Chris Cirefice
30

Pour ceux qui démarrent une application rails avec une base de données existante, il y a un petit bijou cool appelé schema_to_scaffoldpour générer un script d'échafaudage. il génère:

rails g scaffold users fname:string lname:string bdate:date email:string encrypted_password:string

de votre schema.rbnotre votre renommé schema.rb. Vérifiez-le

frenesim
la source
2
C'est un super petit bijou, ça m'aidera beaucoup! Devrait être intégré à Rails!
Peter Andersson
13

Dans Rails 5 , vous pouvez toujours exécuter

$rails generate scaffold movie --skip

pour créer tous les fichiers d'échafaudage manquants ou

rails generate scaffold_controller Movie

pour créer le contrôleur et afficher uniquement.

Pour une meilleure explication, consultez l' échafaudage des rails

Nesha Zoric
la source
12

Cette commande devrait faire l'affaire:

$ rails g scaffold movie --skip
Andrew Hendrie
la source
10

Vous pouvez utiliser scaffold_controlleret ne pas oublier de passer le attributesmodèle, sinon l'échafaudage sera généré sans les attributs.

rails g scaffold_controller User name email
# or
rails g scaffold_controller User name:string email:string

Cette commande générera les fichiers suivants:

create  app/controllers/users_controller.rb
invoke  haml
create    app/views/users
create    app/views/users/index.html.haml
create    app/views/users/edit.html.haml
create    app/views/users/show.html.haml
create    app/views/users/new.html.haml
create    app/views/users/_form.html.haml
invoke  test_unit
create    test/controllers/users_controller_test.rb
invoke  helper
create    app/helpers/users_helper.rb
invoke    test_unit
invoke  jbuilder
create    app/views/users/index.json.jbuilder
create    app/views/users/show.json.jbuilder
Deepak Mahakale
la source