rails fields_for не отображает после ошибки проверки на вложенной форме - PullRequest
8 голосов
/ 31 августа 2010

У меня проблема с вложенной формой. Я реализовал решение для вложенных форм из Railscasts 196 и 197. Оно работает, если у меня нет ошибок валидации.

Итак, форма отлично отображается при загрузке, включая вложенные поля (в части fields_for).

Но форма имеет проверки. При сбое проверки контроллер отображает: новый. Затем форма хорошо отображает связанные поля модели, но вложенные поля больше не отображаются. Есть ли решение для этого?

контроллер

  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

часть вида:

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

Ответы [ 3 ]

12 голосов
/ 31 августа 2010

Выдает ли это ошибку?

Полагаю, ваша проблема в том, что в вашем действии new вы выполняете @property.images.build, чего нет в вашем действии редактирования.Если проверка не пройдена, она отобразит ваше новое действие, но не запустит ваше новое действие.Вы можете попробовать вставить @property.images.build в условие else вашего create действия, например:

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

Не самый чистый способ сделать это, во что бы то ни стало, но это поможет отследить, если это вашевыпуск.

3 голосов
/ 10 января 2011

У меня тоже была такая же проблема с этим поведением. Так как я не вижу вашу модель, я предполагаю, что у вас есть: reject_if =>: all_blank или какая-то другая лямбда. Это кажется виновником, хотя у меня нет решения. Я бы оставил это как комментарий вместо ответа, но, видимо, у меня недостаточно репутации, чтобы делать такие вещи.

1 голос
/ 22 августа 2011

на данный момент, единственный способ исправить это - переписать метод 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

надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...