2010-02-06 13 views
7

En la primera página de mi rap lyrics explanation site, hay un lugar donde los usuarios pueden intentar explicar una línea desafiante:formas múltiples para el mismo modelo en una sola página

alt text http://dl.dropbox.com/u/2792776/screenshots/2010-02-06_1620.png

Aquí está el parcial que utilizo para generar este :

<div class="stand_alone annotation" data-id="<%= annotation.id %>"> 
    <%= song_link(annotation.song, :class => :title) %> 

    <span class="needs_exegesis"><%= annotation.referent.strip.gsub(/\n/, "\n <br />") %></span> 

    <% form_for Feedback.new(:annotation_id => annotation.id, :created_by_id => current_user.try(:id), :email_address => current_user.try(:email)), :url => feedback_index_path, :live_validations => true do |f| %> 
    <%= f.hidden_field :annotation_id %> 
    <%= f.hidden_field :created_by_id %> 
    <p style="margin-top: 1em"> 
     <%= f.text_area :body, :rows => 4, :style => 'width:96%', :example_text => "Enter your explanation" %> 
    </p> 
    <p> 
     <% if current_user %> 
     <%= f.hidden_field :email_address %> 
     <% else %> 
     <%= f.text_field :email_address, :example_text => "Your email address" %> 
     <% end %> 
     <%= f.submit "Submit", :class => :button, :style => 'margin-left: .1em;' %> 
    </p> 
    <% end %> 
</div> 

Sin embargo, poner más de uno de estos en una sola página es problemático porque Rails da automáticamente forman cada uno un ID de new_feedback, y cada campo un ID como feedback_body (t líder o colisiones de nombres)

Obviamente podría agregar algo como :id => '' a la forma y todos sus campos, pero esto parece un poco repetitivo. ¿Cuál es la mejor manera de hacer esto?

Respuesta

3

Tuve el mismo problema en un sitio en el que estoy trabajando actualmente y elegí la solución que mencionas en la parte inferior. No es repetitivo si genera el ID programáticamente y coloca todo el formulario en forma parcial. Por ejemplo, en mi sitio, tengo varias "entradas" por página, cada una de las cuales tiene dos formas de votación, una para votar y otra para votar. El ID de registro para cada entrada se añade al ID DOM de sus votos formas para que sea único, al igual que (solo se muestra el botón de votación arriba, el botón de votación abajo es similar):

<% form_for [entry, Vote.new], :html => { :id => 'new_up_vote_' + entry.id.to_s } do |f| -%> 
    <%= f.hidden_field :up_vote, :value => 1, :id => 'vote_up_vote_' + entry.id.to_s %> 
    <%= image_submit_tag('/images/icon_vote_up.png', :id => 'vote_up_vote_submit' + entry.id.to_s, :class => 'vote-button vote-up-button') %> 
<% end -%> 
+0

obras supongo, pero no muy railsy – brittohalloran

6

¿Consideró nested_attributes para los modelos de rieles? En lugar de tener múltiples formularios de comentarios new donde cada uno está vinculado a una anotación, puede tener múltiples formularios de anotación edit donde cada anotación incluye campos para una nueva retroalimentación. Los id de los formularios generados incluirían el ID de anotaciones, como edit_annotation_16.

El modelo de anotación tendría una relación con sus retroalimentaciones y también aceptará atributos anidados para ellas.

class Annotation < ActiveRecord::Base 
    has_many :feedbacks 
    accepts_nested_attributes_for :feedbacks 
end 

class Feedback < ActiveRecord::Base 
    belongs_to :annotation 
end 

Puede agregar tantas formas como desee, una para cada anotación. Por ejemplo, esto es lo que he intentado:

<% form_for @a do |form| %> 
    Lyrics: <br /> 
    <%= form.text_field :lyrics %><br /> 
    <% form.fields_for :feedbacks do |feedback| %> 
     Feedback: <br/> 
     <%= feedback.text_field :response %><br /> 
    <% end %> 
    <%= form.submit "Submit" %> 
<% end %> 

<% form_for @b do |form| %> 
    Lyrics: <br /> 
    <%= form.text_field :lyrics %><br /> 
    <% form.fields_for :feedbacks do |feedback| %> 
     Feedback: <br/> 
     <%= feedback.text_field :response %><br /> 
    <% end %> 
    <%= form.submit "Submit" %> 
<% end %> 

y el controlador rápido y sucio de lo anterior vista de edición:

class AnnotationsController < ApplicationController 
    def edit 
    @a = Annotation.find(1) 
    @a.feedbacks.build 
    @b = Annotation.find(2) 
    @b.feedbacks.build 
    end 

    def update 
    @annotation = Annotation.find(params[:id]) 
    @annotation.update_attributes(params[:annotation]) 
    @annotation.save! 
    render :index 
    end 
end 
2

También tuve el mismo problema, pero quería una solución más extensible que la adición de la ID a cada campo. Como ya estamos usando form_for ... | f | notación el truco es cambiar el nombre del modelo y obtienes un nuevo prefijo de ID HTML.

Uso de una variante de este método: http://www.dzone.com/snippets/create-classes-runtime (I eliminó la materia & bloque)

I crear un nuevo modelo que es una copia exacta del modelo Quiero una segunda forma para en la misma página. Luego usa ese nuevo modelo para representar la nueva forma.

Si la primera forma está utilizando

@address = Address.new 

entonces

create_class('AddressNew', Address) 
@address_new = AddressNew.new 

Su prefijo ID habrá 'address_new_' en lugar de 'address_' para la segunda forma del mismo modelo. Cuando se lee la forma params puede crear un modelo de Dirección para poner los valores en.

7

Si no desea cambiar sus nombres de entrada o la estructura de su modelo, puede utilizar la opción id para hacer su forma de identificación único y la opción namespace para hacer su entrada identificadores únicos:

<%= form_for Feedback.new(...), 
    id: "annotation_#{annotation.id}_feedback" 
    namespace: "annotation_#{annotation.id}" do |f| %> 

de esa manera nuestro formulario de identificación es única, es decir, annotation_2_feedback y esto también añadir un prefijo, por ejemplo annotation_2_, a cada entrada creada a través de f.

+0

el hombre Ah, gracias por la punta "espacio de nombres"! – elsurudo

Cuestiones relacionadas