2009-02-02 14 views
14

Nicht sicher, ob ich this richtig gelesen habe, aber es scheint, als würde Scaffold keine Eins-zu-viele-Beziehung in seiner Gesamtheit machen. Zum Beispiel, wenn ich messages mit Gerüst erstellen und dann möchte ich comments auf denen messages (ein message -> viele comments), ich muss gehen und alles ändern. Zum Beispiel muss ich dies in der new Ansicht s‘comment ändernRails: Scaffold, um automatisch eine Eins-zu-viele-Beziehung herzustellen

<% form_for(@comment) do |f| %> 

dieser

<% 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 werden, oder?

Antwort

12

Das stimmt, aber es ist nicht das Ende der Geschichte. Es gibt mindestens zwei Alternativen zu Scaffold, die beide recht gut funktionieren und automatisch Beziehungen zwischen Klassen aufnehmen (basierend auf Ihren ActiveRecord-Beziehungsindikatoren wie has_many). Eine dieser Alternativen ist Streamlined und die andere ist ActiveScaffold.

Sie sind hauptsächlich hilfreich bei der Eingabe von Daten, die Ihr System benötigt und die keine vom Benutzer eingegebenen Daten sind. Zum Beispiel verwende ich sie für administrative Aufgaben in Tabellen, wo es keinen Sinn macht, eine vollständige Benutzeroberfläche für CRUD zu erstellen, wenn eine der Gerüstalternativen die Aufgabe für ein selten verwendetes Feature gut erfüllt. Sie möchten sie jedoch nicht für Kommentare zu Nachrichten verwenden.

+1

Gute Sachen, John, danke. –

+0

Für eine ganze Reihe von möglichen Optionen: https://www.ruby-toolbox.com/categories/rails_admin_interfaces – givanse

13

Ja. Scaffold funktioniert für ein Modell und einen zugehörigen Controller. Es kümmert sich nicht um oder arbeitet mit Beziehungen.

Scaffolds Hauptziel ist es, CRUD mit Hilfe eines Controllers und zugehöriger Ansichten auf ein Modell zu bringen. Das ist alles. Alle anderen Anforderungen wie Beziehungen müssen manuell codiert werden.

+1

Ausgezeichnet. Es spart noch einiges an Arbeit ... Ich stelle mir vor/träume, dass es in Zukunft auch Beziehungen geben wird. –

+0

Ja. Und ich stelle mir eine App vor, die eine Rails-App mit Drag & Drop und minimaler Konfiguration schreibt. Es wird passieren. Bald! :) – Chirantan

+0

Ich kann mir vorstellen, dass Sie schon das Admin-Juwel gesehen haben, oder? –

1

Gerüste sind Gerüste. Wenn Sie etwas anderes als ein CRUD auf einer Tabelle haben wollen (was ein Gerüst ist/tut), müssen Sie den erzeugten Gerüstcode ändern oder einen eigenen erstellen.

+0

Danke dafür.Ich würde gerne aufhören zu rollen, aber 2009 dreht sich alles nur noch um das eigene Rollen. –

3

Beachten Sie, dass es Projekte wie Hobo für Rails gibt, mit denen Sie Ihre Felder und Verknüpfungen im Modell selbst behalten können. Sie können keine Assoziationen aufbauen, aber es ist ziemlich nah.

Sie zahlen für diesen Zucker, indem Sie viel mehr von der Anwendung hinter Ihrem Rücken gebaut haben. Anstatt Ihre eigenen zu rollen, subtrahieren Sie in der Regel das, was Sie benötigen, von einer großen Bank vorgefertigter Verhaltensweisen.

+0

Cool, danke, ich werde es überprüfen. Momentan benutze ich kein Scaffold, aber ich benutze sogar die REST-Sachen ziemlich oft ... –

1

Sie benötigen kein schweres Rails Admin-Framework, um Eins-zu-Viele-Beziehungen zu erhalten.

Sie können Gerüste verwenden, um den größten Teil des Weges dorthin zu kommen.

Ein wenig mehr Arbeit in der Steuerung und _form Ansicht wird Sie den Rest des Weges dorthin bekommen.

So geht's ...

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 ein 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 (beer_id) Referenzierung die Bier Tabelle hat:

create_table "developers", force: true do |t| 
    t.string "name" 
    t.integer "beer_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Wir kann Gerüst verwenden, um beide Tabellen zu erstellen:

$ Schienen g Gerüst Biername

g Gerüst Entwickler Name beer_id $ Schienen: integer

Das Gerüst Befehl die Controller und Ansichten für jedes Modell erstellt.

müssen wir unsere Controller modifizieren und sieht ein wenig das Dropdown-Menü zu bekommen ein Bier für jeden Entwickler wählen:

app/views/Entwickler/_form.html.erb

ersetzen des erzeugten text_field und Bezeichnung für beer_id mit folgendem:

<div class="field"> 
    <%= f.label :beer_id %><br /> 
    <%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %> 
    </div> 

app/Controller/developer_controller.rb

Bearbeiten Sie die neue und bearbeiten die Controller-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

enter image description here

enter image description here

enter image description here

Anmerkungen

Schienen Gerüste ist großartig. 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.

Hoffe, dass hilft. ~ Lex

Verwandte Themen