ruby on rails - Ayuda de formulario Rails+MongoMapper+EmbeddedDocument
ruby-on-rails forms (2)
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:
Primero, ¿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!
Aún más fácil ahora: actualización para Rails 4.1.1, ruby 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>
Este es 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 partes menores de la implementación, pero eso debería funcionar.