2010-08-31 7 views
8

Ich habe ein verschachteltes Formular Problem. Ich implementierte die verschachtelte Formularlösung aus den Railscasts 196 & 197. Es funktioniert, wenn ich keine Validierungsfehler habe.Rails fields_for wird nach dem Validierungsfehler auf geschachteltem Formular nicht gerendert

So rendert Form perfekt, wenn es geladen wird, einschließlich der verschachtelten Felder (in den fields_for part).

Aber das Formular hat Validierungen. Wenn eine Validierung fehlschlägt, gibt der Controller Folgendes aus: neu. Dann macht das Formular die verknüpften Modellfelder in Ordnung, aber die verschachtelten Felder werden nicht mehr gerendert. Gibt es dafür eine Lösung?

der 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 

Teil der Ansicht:

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

Antwort

12

es einen Fehler aus, Hat?

Meine Vermutung ist, dass Ihr Problem darin besteht, dass Sie in Ihrer new Aktion @property.images.build tun, die nicht in Ihrer Bearbeitungsaktion ist. Wenn die Validierung fehlschlägt, wird Ihre neue Aktion gerendert, die neue Aktion wird jedoch nicht ausgeführt. Sie könnten versuchen, @property.images.build in der else-Klausel Ihrer create Aktion wie wenn man:

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

Nicht der sauberste Weg, es zu tun, mit allen Mitteln, aber dies wird dazu beitragen, aufzuspüren, wenn das Ihr Problem.

+0

Hallo, Es wirft keinen Fehler, es ist nur nicht gerendert, auch kein Fehler im Protokoll. Und ja, Ihre Lösung funktioniert! :) Vielen Dank –

1

Ich hatte auch das gleiche Problem mit diesem Verhalten. Da ich Ihr Modell nicht sehen kann, denke ich, dass Sie haben: reject_if =>: all_blank oder ein anderes Lambda. Dies scheint der Schuldige zu sein, obwohl ich keine Lösung habe. Ich würde dies als Kommentar anstatt als Antwort hinterlassen, aber anscheinend habe ich nicht genug Ansehen, um so etwas zu tun.

1

in diesem Moment die einzige Möglichkeit zu beheben, dass es nur die Create-Methode überschrieben wurde.

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 

hoffe es hilft!

Verwandte Themen