2010-12-30 5 views
1

Ich habe ein Rails 3.0-Projekt, Mongo mit MongoMapper verwenden. Ich habe ein Modell mit grundlegenden Informationen über einen Tierladen, der viele Haustiere hat. Ein Haustier ist ein separates Modell.Hinzufügen einer Verarbeitung benutzerdefinierte Formularfeld in Schienen 3.0 mit Mongomapper

Ich habe ein Formular, mit dem ich neue Petstores erstellen kann, aber wie füge ich ein Feld hinzu, um gleichzeitig ein Pet zu erstellen, während ich den neuen Store erstelle? Im Moment habe ich eine gehackte Lösung, die bewirkt, was ich will, aber ich habe wahrscheinlich einen Rails-Weg, um das zu tun, oder? Wie kann ich es richtig machen, so dass ich Validierungen auf den Formularfeldern und dergleichen verwenden kann?

Meine aktuelle Lösung beinhaltet das manuelle hacken in einem Formularfeld für das Haustier (in der Formularvorlage wurde ein Tag mit name = "petstore [pet]" hinzugefügt. Dieses Formular wird von der create-Methode von petstore_controller verarbeitet und ich habe Code zum Erstellen hinzugefügt ein Tier aus dem Formularfeld

Modelle:

class Petstore 
    include MongoMapper::Document 

    many :pets, :dependent => :destroy 

    key :name, String 
    key :address, String 
end 

class Pet 
    include MongoMapper::Document 

    belongs_to :petstore 

    key :petstore_id, ObjectID, :required=>true 
    key :type, String, :required=>true 
    key :name, String 
end 

_form.html.erb

<%=form_for @petstore do |f| %> 
    <li> 
    <%= f.label :name %> 
    <%= f.text_field :name, :placeholder =>"The name" %> 
    </li> 
    <li> 
    <%= f.label :address %> 
    <%= f.text_field :address, :placeholder =>'The address' %> 
    </li> 
    <li> 
    <label for="petstore_pet">Type of pet</label> 
    <input type="text" id="petstore_pet" name="petstore[pet]"> 
    <li> 
    <%= f.submit "Submit" %> 
    </li> 
<% end %> 

petstores_controller.rb

def create 
    pet = @petstore.pets.build :type => params[:petstore][:pet] 
    pet.save if pet 

    respond_to do |format| 
    ... 
    end 
end 

ähnliche Themen/Fragen:

(Ich bin mir nicht ganz sicher, wie diese Lösung auf meine Frage zur Karte.)

(Akzeptierte Antwort verweist auf einen Google Group-Thread, der ein wenig über meinem Kopf ist ...)

Antwort

1

Kurze Antwort, es gibt keine saubere, einfache Möglichkeit, dies zu tun.

Etwas längere Antwort:

Ihr Controller wird versuchen, ein Modell zu erstellen/aktualisieren, indem es die Hash abgeleitet aus dem Formular übergeben. Der Schlüssel zum erfolgreichen Verschachteln von Formularen besteht darin, zuerst Ihr Formular zu erhalten, um Ihnen die korrekten Daten zurückzugeben. Ich denke, du hast diese Rolle verloren. Zweitens müssen Sie PetStore.create, um "das Richtige" mit diesem Hash zu tun.

In MongoMapper sind die Regeln für den Umgang mit dem Hash sehr einfach. Es erstellt und Instanz Ihres Modells und ruft dann #{key}= value für jedes Schlüssel/Wert-Paar in dem Hash auf. Zum Beispiel, wenn MyModel ist eine MongoMapper Document-Klasse und ich rufe MyModel.create(:foo=>"bar",:baz=>5) MongoMapper erstellt in Instanz von MyModel und ruft foo="bar" und darauf. Solange diese Methoden existieren, ist MongoMapper egal, was sie tun. (Beachten Sie die key Klassenmethode erstellt diese Methoden für jeden Schlüssel.)

Um dies alles zum Laufen zu bringen, müssen Sie eine pet= Methode auf PetStore erstellen und es ein Haustiermodell aufbauen lassen.

Dies ist nicht durch eine perfekte Antwort, aber es sollte genug sein, damit Sie etwas zur Arbeit bekommen.