2010-03-26 15 views
9

Estoy trabajando en una aplicación web bastante simple (últimas palabras famosas) y estoy trabajando con Rails 2.3.5 + MongoMapper 0.7.2 y el uso de documentos incrustados. Tengo dos preguntas para hacer:Rails + MongoMapper + EmbeddedDocument form help

En primer lugar, ¿hay alguna aplicación de ejemplo usando Rails + MongoMapper + EmbeddedDocument? ¿Preferiblemente en GitHub o en algún otro sitio similar para que pueda echar un vistazo a la fuente y ver dónde debo dirigirme? Si no ...

... ¿cuál es la mejor manera de abordar esta tarea? ¿Cómo podría crear un formulario para manejar un documento incrustado?

Lo que intento hacer es agregar direcciones a los usuarios. Puedo arrojar los dos modelos en cuestión si lo desea.

¡Gracias por la ayuda!

Respuesta

10

Aquí está el enfoque básico que tomé en una de mis aplicaciones. El problema tiene muchas respuestas: el problema es un documento; la respuesta es un documento incrustado. Puede usar el enlace "agregar respuesta" para generar otro campo de respuesta y el enlace "eliminar" para eliminar uno.

_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 

corté un par de bits de menor importancia de la puesta en práctica , pero eso debería funcionar

+1

Gracias por la ayuda, que me dan algunas ideas. Me pregunto cómo se vería tu controlador. ¿MongoMapper maneja todo el mapeo? ¿Hiciste algo más? Gracias! –

+0

Nope: controlador scaffolded típico, sin código especial en los modelos, y vandalo MongoMapper 0.7.0. – PreciousBodilyFluids

+0

Muchas gracias, voy a intentarlo esta noche. –

1

Incluso más fácil ahora - actualización para Rails 4.1.1, rubí 2.1.1p76:

Modelos:

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

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

controlador:

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>