2010-03-26 7 views
9

Ich arbeite an einer ziemlich einfachen Web-Anwendung (berühmte letzte Worte) und arbeite mit Rails 2.3.5 + MongoMapper 0.7.2 und mit eingebetteten Dokumenten. Ich habe zwei Fragen zu stellen:Rails + MongoMapper + EmbeddedDocument Formular Hilfe

Erstens, gibt es irgendwelche Anwendungsbeispiele draußen mit Rails + MongoMapper + EmbeddedDocument? Am liebsten auf GitHub oder einer anderen ähnlichen Seite, damit ich mir die Quelle anschauen und sehen kann, wo ich eigentlich hingehen soll? Wenn nicht ...

... was ist der beste Weg, um diese Aufgabe anzugehen? Wie würde ich ein Formular erstellen, um ein eingebettetes Dokument zu bearbeiten?

Was ich versuche, ist das Hinzufügen von Adressen zu Benutzern. Ich kann die beiden Modelle in Frage stellen, wenn Sie möchten.

Danke für die Hilfe!

Antwort

10

Hier ist der grundlegende Ansatz, den ich in einer meiner Apps gemacht habe. Problem hat viele Antworten - Problem ist ein Dokument, Antwort ist ein eingebettetes Dokument. Sie können den Link "Antwort hinzufügen" verwenden, um ein weiteres Antwortfeld zu generieren, und den Link "Entfernen", um einen zu löschen.

_form.html.erb:

<% form_for @problem do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :content %><br /> 
    <%= f.text_area :content, :size => '50x7' %> 
    </p> 

    ...etc... 

    <%= add_answer_link "(add answer)" %> 
    <div id="answers"> 
    <%= render :partial => 'answer', :collection => @problem.answers %> 
    </div> 

    <p><%= f.submit "Submit" %></p> 
<% end %> 

_answer.html.erb:

<div class="answer"> 
    <% fields_for 'problem[answers]', answer, :index => nil do |f| -%> 
    <%= f.label :content, "Answer #{answer.id}:" %> 
    <%= f.text_field :content, :size => 50 %> 
    <%= link_to_function "(remove)", "$(this).up('.answer').remove()" %> 
    <% end -%> 
</div> 

problems_helper.rb

module ProblemsHelper 
    def add_answer_link(name) 
    link_to_function name do |page| 
     page.insert_html :bottom, "answers", :partial => 'answer', :object => Answer.new 
    end 
    end 
end 

ich kleinere Bits der Umsetzung ein paar ausgeschnitten aber das sollte funktionieren.

+1

Danke für die Hilfe, die mir ein paar Ideen geben. Ich frage mich, wie Ihr Controller aussehen könnte. Handelt MongoMapper mit all dem Mapping? Haben Sie etwas anderes gemacht? Danke! –

+0

Nein - typische gerüstete Controller, kein spezieller Code in den Modellen und Vanille MongoMapper 0.7.0. – PreciousBodilyFluids

+0

Vielen Dank, ich werde es heute Abend versuchen. –

1

Noch einfacher jetzt - Update für Rails 4.1.1, Rubin 2.1.1p76:

Modelle:

class Location 
include MongoMapper::EmbeddedDocument 
    key :state, String, :default => "CA" 
    key :zip, String 
    timestamps! 
end 

class House 
include MongoMapper::Document 
timestamps! 
one :location 
end 

Controller:

def new 
    @house = House.new 
end 

new.html.erb:

<%= form_for @house, url: houses_path do |house_form| %> 
<p> 
    <%= house_form.label :name %><br> 
    <%= house_form.text_field :name %> 
</p> 

<%= house_form.fields_for :location do |address_fields| %> 

    Street : <%= address_fields.text_field :street %> 
    Zip code: <%= address_fields.text_field :zip %> 
<% end %> 

<p> 
    <%= house_form.submit %> 
</p>