2010-07-26 7 views
6

Ich bin ein .NET-Typ und versuche das Konzept hinter Rails und seinen Active Record-Sachen zu verstehen.ruby ​​on rails Architekturmodell, Ansicht und DTOs

Wie ich in allen Beispielen sehen sie immer davon ausgehen, dass Ihre Ansicht eine 1: 1 Kopie des Modells. In Wirklichkeit ist das oft nicht wahr.

Wie eine Ansicht, die einen Kunden und Ansprechpartner hält (n), die nicht an diesen Kunden bezogen sind. Benutzer sollten in der Lage sein, sowohl die (Kunden- und Kontaktperson (en) in einer Ansicht zum Beispiel) bearbeiten

In jedem Beispiel sehe ich, dass sie den Blick direkt auf ein Activerecord-Objekt binden. Alle Dinge wie das Modell, die Validierung usw. werden an ein Objekt gebunden, das direkt der Datenbank zugeordnet ist.

Könnte ein Rails Kerl was noch eine elegante Art und Weise erklärt, mit Active Record im wirklichen Leben Anwendungen in komplexen Modellsituationen zu arbeiten? Im ersten Moment habe ich über DTOs nachgedacht, aber ich konnte mir nicht vorstellen, dass dies der richtige Weg für Rails ist.

Antwort

0

Da Rails eine MVC-Architektur verwendet, ist es problemlos möglich — und oft üblich — einen Controller zu haben, der mehrere Modelle koordiniert und sie der Ansicht zum Rendern bereitstellt.

Ich denke, dass die Datenübertragung Objekte denken über eine Sackgasse ist, weil sie nur stumm Datenhalter und Active Modelle in Rails sind mehr Köpfchen haben. Sie haben zum ersten Mal assoziierte Modelle (ich weiß, DTOs können strukturelle Beziehungen mit anderen DTOs haben), benutzerdefinierte Finder-Methoden und Validierungslogik.

1

Vereinbaren Sie mit John ....

Sie fragte: „. Wie eine Ansicht, die einen Kunden und Kontaktperson (en), die mit diesem Kunden verbunden sind nicht hält Benutzer in der Lage sein sollte, sowohl (Kunden zu bearbeiten und Kontaktperson (en) in einer Ansicht zum Beispiel)“

Ok, so ist dies ein Kundenmodell, das einige Mitarbeiter hat, nicht wahr? Wenn nicht, ersetzen "Mitarbeiter" mit "Person"

/app/model/customer.rb

Class Customer < ActiveRecord::Base 
    has_many :employees 
    accepts_nested_attributes_for :employees 
end 

/app/model/employee.rb

Class Employee < ActiveRecord::Base 
    belongs_to :customer 
end 

Dann in Ihrer Ansicht der Kunde /app/views/customers/show.html.erb

<%= form_for(@customer) do |f| %> 

<%= f.text_field :name %> 
.... yada yada .... 

<%= f.fields_for(:employees) do |ef} %> 
    <%= ef.text_field :first_name%> 
    <%= ef.text_field :phone %> 
<% end %> 

<%= f.submit %> 

<% end %> 

die oben hat 1 Formular, das Sie th speichern können Der Kunde und seine Mitarbeiter. Nested Form genannt, und ich denke, es ist die Aufgabe von "View Models".

Wenn Sie nur halten sie gruppiert, wie real-life gruppiert ist, geht es ziemlich einfach.

+0

das ist ok, weil sie verwandt sind, aber was ist, wenn sie nicht verwandt sind? Ist es möglich, form_for (@customer) und form_for (@employee) in einem Formular zu verwenden? – awex

+1

sicher kannst du. Das wäre wahrscheinlich bei einer Art Dashboard-Controller vorbei, aber Sie können zwei oder mehr Formulare auf einer HTML-Seite haben. –