Ayuda con formulario y distintos models

buenas… tengo un problema y no se como afrontarlo, entonces acudí a
uds

tengo 4 modelos

  • Propiedades
    • Casas
    • Departamentos
      • Fotos

Propiedad -> Casas
-> Departamentos ( Propiedades tiene muchas casas y muchos
departamentos )

Casas -> Fotos
Departamentos -> Fotos

Casas tiene muchas Fotos
Departamentos tiene muchas Fotos

tengo que crear un formulario para que el usuario pueda ingresar una
casa o departamento… la manera que esta hecho es asi… primero creas
una propiedad, dependiendo de si es casa o departamento lo redirige
hacia el control respectivo ( casa o departamento )y al 3 paso ingresa
la Imagen.

el problema es que si el usuario cancela en algun paso el ingreso de la
propiedad, esta queda coja ( tengo validado que cuando ingrese a sus
propiedades, este las actualice y complete ) pero… existira una mejor
forma de crear este formulario de 3 pasos y que al finalizar el 3 paso
cree todos los Datos ingresados?

Saludos desde Chile!

Podrias hacerlo todo en un solo formulario y validando cada uno de los
campos utilzando fiels_for, aqui tengo un ejemplo

Nombre: <%= f.text_field :nombre %>

Apellido: <%= f.text_field :apellido %>

<% fields_for(:materia) do |f| %>

Nombre: <%= f.text_field :nombre %>

Maestro: <%= f.text_field :maestro %>

<% end %>

y en el controlador grabas lod datos en este caso de las dos formas en
este caso pregunto si el alumno y la materia son validas se graban las
dos

class AlumnosController < ResourceController::Base
def new
@alumno = Alumno.new
@materia = Materia.new
end

def create
@alumno = Alumno.new(params[:alumno])
@materia = @alumno.materias.build(params[:materia])
if @alumno.valid? && @materia.valid?
if @alumno.save
redirect_to :action => ‘index’
else
render :action => ‘new’
end
else
render :action => ‘new’
end
end
end

Espero te sirva

Hola David, he afrontado el mismo problema que tu con adondevivir.com,
te
comento algunas cosas que te pueden ser útiles:

  1. Para el manejo de distintos tipos de propiedades uso STI[1], las
    validaciones y demas cosas que son comunes a todos los tipos de
    propiedades
    las coloco en el modelo principal: Property.

  2. Las fotos estarian relacionadas a la propiedad(modelo Property) y no
    a un
    tipo de propiedad en especial.

  3. para la creación de una nueva propiedad hago lo siguiente:

http://localhost:3000/panel/properties/new?t=apartment
http://localhost:3000/panel/properties/new?t=office

y asi sucesivamente para cada tipo de propiedad. En el controlador para
el
manejo de propiedades, concretamente en la accion new tengo lo
siguiente:

def new
unless params[:t].blank?
begin
@property = params[:t].camelize.constantize.new
if !@property.kind_of?(Property)
render :template => ‘panel/properties/select_property’ and
return
end
@disabled_features = (Property::OPTIONAL_FEATURES.keys -
@property.disable_features)
render :template => ‘panel/properties/new’
rescue NameError
render :template => ‘panel/properties/select_property’
end
else
render :template => ‘panel/properties/select_property’
end
end

Basicamente lo que hago es comprobar que el tipo de propiedad elegida
sea
una valida(para evitar por ahi que ingresen la URL manualmente), si no
es un
tipo de propiedad valida o no se le pasa el parametro entonces renderiza
la
vista donde tiene que escoger el tipo de propiedad a crear, en esta
accion
tambien inicializo la variable @disable_features que basicamente guarda
los
atributos que la propiedad esta siendo creada no deberia tener, por
ejemplo
un terreno agricola no tiene numero de baños, espero que eso te sirva en
algo.

[1]http://wiki.rubyonrails.org/rails/pages/SingleTableInheritance

Saludos.

Una pregunta, en vez de instanciar el params[:t], no tendría más
sentido hacer un:

params[:t].camelize.constantize.superclass.kind_of? Property

Hola Francesc, tienes razón, justo ahora estamos en plena
refactorización y
agregando nuevas caracteristicas.

Saludos y gracias!