2010-08-31 7 views
8

Mam problem z zagnieżdżoną formularzem. Zaimplementowałem rozwiązanie z postaciami zagnieżdżonymi z railscastów 196 & 197. Działa, jeśli nie mam błędów sprawdzania poprawności.szyny field_for nie wyświetla się po błędzie sprawdzania poprawności w postaci zagnieżdżonej

Tak więc, formularz renderuje się doskonale po załadowaniu, łącznie z polami zagnieżdżonymi (w części fields_for).

Ale formularz ma walidacje. Gdy sprawdzanie poprawności nie powiedzie się, kontroler wyrenderuje: nowy. Następnie formularz renderuje połączone pola modelu, ale zagnieżdżone pola nie są już renderowane. Czy jest na to jakieś rozwiązanie?

kontroler

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 

część zdania:

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

Odpowiedz

12

Czy rzucać błąd?

Zgaduję, że Twoim problemem jest to, że w akcji new robisz @property.images.build, czego nie ma w twojej akcji edycji. Gdy sprawdzanie poprawności nie powiedzie się, wyrenderuje nowe działanie, ale nie uruchomi nowej akcji. Można spróbować umieścić @property.images.build w klauzuli innego swojego działania create jak:

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

nie najczystsze sposób to zrobić, za pomocą wszelkich środków, ale to pomoże wyśledzić, jeśli to jest twój problem.

+0

Witam, Nie powoduje błędu, nie jest renderowany, również nie ma błędu w dzienniku. I tak, twoje rozwiązanie działa! :) dzięki –

1

Też miałem ten sam problem z tym zachowaniem. Ponieważ nie widzę twojego modelu, domyślam się, że masz: reject_if =>: all_blank lub inne lambda. Wydaje się, że jest to winowajca, chociaż nie mam rozwiązania. Pozostawiłbym to jako komentarz zamiast odpowiedzi, ale najwyraźniej nie mam wystarczającej reputacji, żeby zrobić coś takiego.

1

w tym momencie, jedyny sposób, jaki mogę naprawić, to tylko nadpisanie metody 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 

mam nadzieję, że pomoże!

Powiązane problemy