Wie laufen Schienen erzeugen Gerüst, wenn das Modell bereits existiert?

331

Ich bin neu bei Rails, daher befindet sich mein aktuelles Projekt in einem seltsamen Zustand.

Eines der ersten Dinge, die ich generiert habe, war ein "Film" -Modell. Ich fing dann an, es detaillierter zu definieren, fügte ein paar Methoden hinzu usw.

Mir ist jetzt klar, dass ich es hätte generieren sollen, um rails generate scaffoldDinge wie Routing, Ansichten, Controller usw. anzuschließen.

Ich habe versucht, das Gerüst zu generieren, aber es wurde eine Fehlermeldung angezeigt, dass bereits eine Migrationsdatei mit demselben Namen vorhanden ist.

Wie kann ich jetzt am besten ein Gerüst für meinen "Film" erstellen? (mit Schienen 3)

Lan
quelle
1
Es ist wahrscheinlich am besten, eigene Controller sowie Ansichten und Routen zu schreiben. Sie erfahren mehr über die Konzepte
Ben Aubin
1
Stimmen Sie mit @ penne12 überein. Zumindest am Anfang, bis Sie mit den Konzepten vertraut sind, damit Sie wissen, was der gesamte Code tut, der für Sie generiert wird.
Mydoghaswürmer
Nicht direkt relevant, aber wenn Sie jemals etwas durcheinander bringen, verwenden Sie Rails Destroy <etc>. Ich erinnere mich, dass dies sehr nützlich war, als ich anfing.
Helsing
1
@BenAubin, obwohl wahr, ist das Schöne an Rails, nicht ständig Boilerplate schreiben zu müssen.
Romuloux

Antworten:

596

TL; DR :rails g scaffold_controller <name>

Auch wenn Sie bereits ein Modell haben, können Sie mithilfe der rails generateOption die erforderlichen Controller- und Migrationsdateien generieren . Wenn Sie ausführen rails generate -h, werden alle verfügbaren Optionen angezeigt.

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

Wenn Sie ein Controller-Gerüst für Ihr Modell erstellen möchten, lesen Sie scaffold_controller. Aus Gründen der Klarheit hier die Beschreibung dazu:

Stummelt einen Gerüstcontroller und seine Ansichten aus. Übergeben Sie den Modellnamen, entweder CamelCased oder under_scored, und eine Liste der Ansichten als Argumente. Der Controller-Name wird als pluralisierte Version des Modellnamens abgerufen.

Um einen Controller innerhalb eines Moduls zu erstellen, geben Sie den Modellnamen als Pfad wie 'parent_module / controller_name' an.

Dies generiert eine Controller-Klasse in App / Controllern und ruft Helfer-, Template-Engine- und Test-Framework-Generatoren auf.

Um Ihre Ressource zu erstellen, würden Sie den resourceGenerator verwenden, und um eine Migration zu erstellen, können Sie auch den migrationGenerator sehen (siehe, es gibt ein Muster für all diesen Wahnsinn). Diese bieten Optionen zum Erstellen der fehlenden Dateien zum Erstellen einer Ressource. Alternativ können Sie einfach rails generate scaffoldmit der --skipOption ausführen , alle vorhandenen Dateien zu überspringen :)

Ich empfehle, einige Zeit damit zu verbringen, die Optionen in den Generatoren zu prüfen. Sie sind etwas, von dem ich glaube, dass sie in Büchern und dergleichen nicht sehr gut dokumentiert sind, aber sie sind sehr praktisch.

Lee Jarvis
quelle
12
Wow, eine der besten Antworten, die ich je auf eine Programmierfrage bekommen habe. Vielen Dank!
Lan
12
Ich habe auch vorhandene Modelle und dabei rails generate scaffold_controller MyModelwird die Ansichtsebene generiert, aber die Modellattribute (Tabellenspalten) sind nicht enthalten, und Sie müssen diese manuell hinzufügen. Kennt jemand eine Lösung dafür? Ich bin auf Schienen 3.2.8.
Aaronbartell
@aaronbartell Sie bitten Rails, einen 'scaffold_controller' zu generieren, der sich nicht um Modellattribute kümmert. Dies ist nicht fehlerhaft. Wenn Sie möchten, dass auch ein Modell generiert wird, möchten Sie, generate scaffoldwenn Sie ein Modell haben, aber einen Gerüstcontroller und neue Attribute zu einem gewünschten Modell hinzufügen möchten, scaffold_generatorgefolgt von migrationden Feldern, die Sie ändern
Lee Jarvis
9
@Lee - Kein aaronbartell fragt, warum der scaffold_controller nicht die entsprechenden Ansichtseingaben für die vorhandenen Attribute des Modells generiert, das an ihn übergeben wurde. Dies
Yarin
67

Tolle Antwort von Lee Jarvis, dies ist nur der Befehl zB; Wir haben bereits ein Modell namens User:

rails g scaffold_controller User
tokhi
quelle
10
Vielen Dank für diejenigen von uns, die zu faul sind, um Textabschnitte zu lesen!
Chris Cirefice
30

Für diejenigen, die eine Rails-App mit vorhandener Datenbank starten, gibt es ein cooles Juwel, das aufgerufen wird schema_to_scaffold, um ein Gerüstskript zu generieren. es gibt aus:

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

von Ihrem schema.rbunser Ihr umbenanntes schema.rb. Überprüfen Sie es

frenesim
quelle
2
Dies ist ein tolles kleines Juwel, es wird mir sehr helfen! Sollte in Rails eingebaut werden!
Peter Andersson
13

In Rails 5 können Sie weiterhin ausführen

$rails generate scaffold movie --skip

um alle fehlenden Gerüstdateien zu erstellen oder

rails generate scaffold_controller Movie

um den Controller zu erstellen und nur anzuzeigen.

Für eine bessere Erklärung schauen Sie sich das Schienengerüst an

Nesha Zoric
quelle
12

Dieser Befehl sollte den Trick machen:

$ rails g scaffold movie --skip
Andrew Hendrie
quelle
10

Sie können das Modell verwenden scaffold_controllerund daran denken, es zu übergeben. attributesAndernfalls wird ein Gerüst ohne die Attribute erstellt.

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

Dieser Befehl generiert folgende Dateien:

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
quelle