2010-08-31 8 views
8

Tengo un problema de formulario anidado. Implementé la solución de formularios anidados de los railscasts 196 & 197. Funciona si no tengo errores de validación.rails fields_for no se procesa después de un error de validación en el formulario anidado

Por lo tanto, la forma se visualiza perfectamente cuando se carga, incluidos los campos anidados (en la parte fields_for).

Pero, el formulario tiene validaciones. Cuando falla una validación, el controlador renderiza: nuevo. A continuación, el formulario representa los campos del modelo vinculados como aceptables, pero los campos anidados ya no se representan. ¿Existe alguna solucion para esto?

el controlador

def new 
    @property = Property.new 
    @property.images.build 
    end 

    def create 
    @property = Property.new(params[:property]) 
    if @property.save 
     flash[:success] = t('Your_property') + ' ' + t('is_successfully_created') 
     redirect_to myimmonatie_url 
    else 
     render :action => 'new' 
    end 
    end 

parte de la vista:

<% form_for :property, @property, :url => { :action => "create" }, :html => { :multipart => true } do |f| %> 
    <div id="new-property-form-spannedcols"> 
     <div class="formField inptRequired"> 
     <%= f.label :postal_code, t("Postal_code") %> 
     <%= f.text_field :postal_code, :class => 'inptMedium short' %> 
     </div> 
     <div id="city_row" class="formField inptRequired"> 
     <%= f.label :city, t("City") %> 
     <div id="city_cell"> 
      <%= render :partial => 'ajax/cities', :locals => { :postal_code => @property.postal_code } %> 
     </div> 
     </div> 

     ... 

     <% f.fields_for :images do |builder| %> 
     <div class="formField"> 
      <%= builder.label :photo, t("Photo_path_max_3mb") %> 
      <%= builder.file_field :photo, :class => 'inptMedium' %> 
      <%= builder.hidden_field :order, :value => "1" %> 
     </div> 
     <% end %> 
    </div> <!-- /new-property-form-spannedcols --> 
    <div class="formBtn"> 
    <%= f.submit t("Save"), :class => 'btnMedium bg-img-home' %>&nbsp; 
    </div> <!-- /formBtn --> 
<%- end -%> 

Respuesta

12

Qué se generará un error?

Supongo que su problema es que en su acción new, usted está haciendo @property.images.build, que no está en su acción de edición. Cuando la validación falla, generará su nueva acción, pero no ejecutará su nueva acción. Se podría intentar poner @property.images.build en la cláusula otra cosa de su acción create como:

else 
    @property.images.build 
    render :action => 'new' 
end 
No

la manera más limpia de hacerlo, por cualquier medio, pero esto le ayudará a localizar a si ese es su problema.

+0

Hola, No arroja un error, simplemente no se representa, tampoco hay ningún error en el registro. Y sí, ¡su solución funciona! :) Gracias –

1

También estaba teniendo el mismo problema con este comportamiento. Como no puedo ver su modelo, supongo que tiene: reject_if =>: all_blank o algún otro lambda. Este parece ser el culpable, aunque no tengo una solución. Dejaría esto como un comentario en lugar de una respuesta, pero aparentemente no tengo suficiente reputación para hacer tal cosa.

1

en este momento, la única forma en que me parece corregirlo fue solo sobrescribiendo el método create.

def new 
    @property = Property.new 
    @property.images.build 
    end 

    def create 
    @property = Property.new(params[:property]) 
    if @property.save 
     flash[:success] = t('Your_property') + ' ' + t('is_successfully_created') 
     redirect_to myimmonatie_url 
    else 
     @property.images.build if @property.images.blank? ##because i'm shure you have something similar to : accepts_nested_attributes_for :images,  :reject_if => lambda { |fields| fields[:image].blank? } 
     render :action => 'new' 
    end 
    end 

espero que ayude!

Cuestiones relacionadas