Rails: Scaffold automatisch eine Eins-zu-viele-Beziehung zu tun
-
20-08-2019 - |
Frage
Nicht sicher, ob ich bin die Lektüre dieses richtig, aber es scheint, wie Scaffold wird eine Eins-zu-viele-Beziehung nicht tun in seiner Gänze. wenn ich messages
mit Gerüst Zum Beispiel erstellen und dann möchte ich auf jene comments
messages
(ein message
-> viele comments
), muss ich gehen und alles ändern. Zum Beispiel, ich habe dies in der comment
Ansicht ändern ist new
<% form_for(@comment) do |f| %>
auf diese
<% form_for([@message, @comment]) do |f| %>
und dann die Aktion ändern, um die @message
var ... unter anderem einzurichten.
Dies kann derzeit nicht automatisch mit Scaffold getan wird, nicht wahr?
Lösung
Das ist wahr, aber es ist nicht das Ende der Geschichte. Es gibt mindestens zwei Alternativen zu Scaffold, dass beide ganz gut funktionieren und automatisch über die Beziehungen zwischen den Klassen abholen (basierend auf dem Active Beziehung Indikatoren wie has_many). Eine dieser Alternativen ist Optimiertes und der andere ist ActiveScaffold .
Sie sind vor allem hilfreich für in der Eingabe von Daten, die Ihr System das erfordert wird keine Benutzerdaten eingegeben. Zum Beispiel, ich benutze sich für administrative Aufgaben auf Tabellen, in denen kein Punkt gibt es eine komplette Benutzeroberfläche für CRUD in dem Aufbau, wenn eines der Gerüstes Alternativen wird die Arbeit nur gut für ein selten genutztes Feature tun. Sie würden sie nicht wollen, obwohl für Kommentare zu Nachrichten verwendet werden.
Andere Tipps
Ja. Scaffold arbeitet für ein Modell und zugehörige Controller. Es braucht nicht kümmern oder mit Beziehungen arbeiten.
Scaffold Das primäre Ziel ist CRUD auf einem Modell in Gang zu bringen einen Controller und zugehörige Ansichten verwenden. Das ist alles. Jede andere Anforderung wie Beziehungen muss manuell kodiert werden.
Beachten Sie, dass es Projekte wie Hobo für Rails, die es Ihnen ermöglichen, Ihre Felder und Verbände innerhalb des Modells zu halten selbst . Sie können nicht Vereinigungen Gerüst, aber es ist ziemlich nah dran.
Sie enden für diesen Zucker zahlen durch viel mehr von der Anwendung hinter dem Rücken gebaut hat. Statt Ihre eigenen von Walzen, sind subtrahieren Sie in der Regel, was Sie von einer großen Bank von prebuilt Verhalten benötigen.
Sie brauchen keine schweren Schienen Admin Rahmen einer Eins-zu-viele-zu bekommen Beziehungen zu arbeiten.
Sie Gerüste können die meisten der Weg dorthin zu gelangen.
Eine wenig mehr Arbeit in der Steuerung und _form Ansicht werden Ihnen den Rest des Weges dorthin gelangen.
Hier ist, wie ...
Story: Select a beer for a developer
In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer
Scenario 1: Select beer for new developer
Given I have clicked the <new> button and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Angenommen, wir haben eine Biere Tabelle:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
Und eine Entwickler Tabelle, die einen Fremdschlüssel hat (beer_id) Referenzierung die Bier Tabelle:
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Wir verwenden Gerüste beiden Tabellen zu erstellen:
$ Schienen g Gerüst Bier Name
$ Schienen g Gerüst Entwickler Name beer_id: integer
Das Gerüst Befehl erstellt die Controller und Ansichten für jedes Modell.
Wir müssen unsere Controller modifizieren und sieht ein wenig das Dropdown-Menü bekommen ein Bier für jeden Entwickler wählen:
app / views / Entwickler / _form.html.erb
Ersetzen des erzeugten text_field und Label für beer_id mit dem folgenden:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
app / controllers / developer_controller.rb
Bearbeiten des Controllers neu und bearbeiten Methoden:
# GET /developers/new
def new
@developer = Developer.new
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
# GET /developers/1/edit
def edit
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
Screen Shots
Notizen
Rails Gerüst ist groß. Schauen Sie sich alle Dateien, die es für Sie erstellt:
$ be rails g scaffold beer name
invoke active_record
create db/migrate/20140912144218_create_beers.rb
create app/models/beer.rb
invoke rspec
create spec/models/beer_spec.rb
invoke factory_girl
create spec/factories/beers.rb
invoke resource_route
route resources :beers
invoke scaffold_controller
create app/controllers/beers_controller.rb
invoke erb
create app/views/beers
create app/views/beers/index.html.erb
create app/views/beers/edit.html.erb
create app/views/beers/show.html.erb
create app/views/beers/new.html.erb
create app/views/beers/_form.html.erb
invoke rspec
create spec/controllers/beers_controller_spec.rb
create spec/views/beers/edit.html.erb_spec.rb
create spec/views/beers/index.html.erb_spec.rb
create spec/views/beers/new.html.erb_spec.rb
create spec/views/beers/show.html.erb_spec.rb
create spec/routing/beers_routing_spec.rb
invoke rspec
create spec/requests/beers_spec.rb
invoke helper
create app/helpers/beers_helper.rb
invoke rspec
create spec/helpers/beers_helper_spec.rb
invoke jbuilder
create app/views/beers/index.json.jbuilder
create app/views/beers/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/beers.js.coffee
invoke scss
create app/assets/stylesheets/beers.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
Alles, was Sie tun müssen, ist zu wissen, welche Dateien zu ändern, wenn Sie wollen mehr als grundlegende CRUD-Operationen.
Ich hoffe, das hilft. ~ Lex
Scaffolds sind Gerüste. Wenn Sie etwas anderes als ein CRUD auf einem Tisch wollen (was ein Gerüst ist / tut), müssen Sie den erzeugten Code Gerüst ändern, oder Ihre eigene Rolle.