2012-05-06 18 views
8

Lo siento si esto se ha preguntado y respondido en su totalidad en alguna parte. No estoy seguro de si estoy buscando con los Rails correctos para esta pregunta.¿Cómo crear un form_for de Rails con campos de formulario dinámicos de una tabla de base de datos?

Me gustaría crear un formulario Rails basado en los campos almacenados en la base de datos. Así es como se ven mis modelos hasta ahora.

class Field < ActiveRecord::Base 
    belongs_to :form 
end 

class Form < ActiveRecord::Base 
    has_many :fields 
end 

El modelo de campo es muy simple a partir de ahora con tipo: cadena y requerido: columnas booleanas. Nombre es el nombre del control que me gustaría crear (cuadro de texto, casilla de verificación, botón de radio). Idealmente me gustaría hacer algo como esto:

<%= form_for [something here] do |f| %> 
    <% @fields.each do |field| %> 
    <%= field.type %><br /> 
    <% end %> 
<% end %> 

estoy luchando por encontrar una forma de reemplazar la línea <% = field.type%> con una etiqueta que represente correctamente la field.type.

¿Esto es posible? ¿Sería mejor utilizar una columna de carga en el modelo de campo almacenando los tipos y valores de campo como json/xml?

+1

es Tipo: Cadena de almacenarla como el método de ayuda rieles (como, radio_button)? En ese caso, puede hacer 'f.send (field.type, field.name)'. De lo contrario, solo asigne los valores de tipo a los ayudantes de Rails, y luego envíe el método correcto. – TuteC

+0

Actualmente no estoy guardando con métodos de ayuda. Soy nuevo en el concepto pero suena exactamente lo que me gustaría hacer. ¿F.send() iría en una etiqueta? Por ejemplo, <% = f.send (field.type, field.name)%>. Gracias. –

+0

Lo que @TuteC mencionó debería funcionar – bruno077

Respuesta

6

Como @TuteC mencionó, puede utilizar el método .send para invocar dinámicamente cada campo, si va a guardar el tipo:

<%= form_for [something here] do |f| %> 
    <% @fields.each do |field| %> 
    <%= f.send(field.type.to_sym, field.name) %><br /> 
    <% end %> 
<% end %> 
+0

Esto funcionó gracias a la ayuda de bruno y @TuteC. –

+0

eres el hombre :) gracias amigo –

Cuestiones relacionadas