2010-08-31 52 views
8

Tôi gặp vấn đề về biểu mẫu lồng nhau. Tôi đã triển khai giải pháp biểu mẫu lồng nhau tạo thành các railscasts 196 & 197. Nó hoạt động nếu tôi không có lỗi xác thực.đường ray fields_for không hiển thị sau khi lỗi xác thực trên biểu mẫu lồng nhau

Vì vậy, biểu mẫu hiển thị hoàn hảo khi được tải, bao gồm các trường lồng nhau (trong phần fields_for).

Nhưng biểu mẫu có xác thực. Khi xác thực không thành công, bộ điều khiển sẽ hiển thị: mới. Sau đó, biểu mẫu hiển thị trường mô hình được liên kết ok, nhưng các trường lồng nhau không được hiển thị nữa. đó có phải là cách giải quyết?

bộ điều khiển

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 

một phần của quan điểm:

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

Trả lời

12

Liệu nó ném ra một lỗi?

Tôi đoán là vấn đề của bạn là trong hành động new, bạn đang thực hiện @property.images.build, không có trong hành động chỉnh sửa của bạn. Khi xác thực không thành công, nó sẽ hiển thị hành động mới của bạn, nhưng sẽ không chạy hành động mới của bạn. Bạn có thể thử đặt @property.images.build trong mệnh đề khác của hành động create của bạn như:

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

Không cách sạch để làm điều đó, bởi bất kỳ phương tiện nào, nhưng điều này sẽ giúp theo dõi xuống nếu đó là vấn đề của bạn.

+0

Xin chào, Nó không ném lỗi, nó không được hiển thị, cũng không có lỗi trong nhật ký. Và có, giải pháp của bạn hoạt động! :) cảm ơn –

1

Tôi cũng gặp vấn đề tương tự với hành vi này. Vì tôi không thể nhìn thấy mô hình của bạn, tôi đoán là bạn có: reject_if =>: all_blank hoặc một số lambda khác. Điều này có vẻ là thủ phạm, mặc dù tôi không có một sửa chữa. Tôi sẽ để lại điều này như một bình luận thay vì trả lời, nhưng dường như tôi không có đủ danh tiếng để làm một điều như vậy.

1

tại thời điểm này, cách duy nhất tôi tìm thấy để khắc phục rằng nó chỉ ghi đè phương pháp tạo.

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 

hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan