2010-08-31 8 views
8

Ho un problema di forma nidificata. Ho implementato la soluzione di moduli nidificati dai railscast 196 & 197. Funziona se non ho errori di validazione.rails fields_for non viene visualizzato dopo l'errore di convalida sul modulo nidificato

Quindi, la forma viene visualizzata perfettamente quando viene caricata, inclusi i campi nidificati (nei campi_per una parte).

Tuttavia, il modulo ha convalide. Quando una convalida fallisce, il controller esegue il rendering: nuovo. Quindi il modulo esegue il rendering dei campi del modello collegato, ma i campi nidificati non vengono più visualizzati. C'è una soluzione per questo?

il controller

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 della 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 -%> 

risposta

12

vuol gettare un errore?

La mia ipotesi è che il tuo problema è che nell'azione new, stai facendo, che non è nella tua azione di modifica. Quando la convalida fallisce, renderà la tua nuova azione, ma non eseguirà la tua nuova azione. Si potrebbe provare a mettere @property.images.build nella clausola else della vostra create azione come:

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

Non il modo più pulito per farlo, con qualsiasi mezzo, ma questo aiuterà a rintracciare se questo è il problema.

+0

Ciao, Non genera un errore, non viene semplicemente visualizzato, anche nessun errore nel registro. E sì, la soluzione funziona! :) Grazie –

1

Avevo anche lo stesso problema con questo comportamento. Dal momento che non riesco a vedere il tuo modello, suppongo tu abbia: reject_if =>: all_blank o qualche altro lambda. Questo sembra essere il colpevole, anche se non ho una soluzione. Vorrei lasciare questo come commento invece di rispondere, ma apparentemente non ho abbastanza reputazione per fare una cosa del genere.

1

in questo momento, l'unico modo in cui trovo di risolvere è stato solo sovrascrivere il metodo di creazione.

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 

spero che sia d'aiuto!

Problemi correlati