simple_form не обнаруживает инициированные проверки для вложенных атрибутов

У меня есть модель под названием «Лечение». По сути, это предложение о встрече с заказчиком и заказчиком, а также (1) :intro (2) :proposed_venue (3) :proposed_date (4) :proposed_time.

Эти четыре атрибута (три из которых являются вложенными атрибутами) отображаются в форме как поля. Все атрибуты имеют валидацию validates_presence_of, но только поле :intro проверяется установленным мной гемм simple_form (https://github.com/plataformatec/simple_form). Это должно быть потому, что только атрибут :intro (из четырех выше) является атрибутом модели лечения. У Treating есть много предложенных мест через модель Venue, а также много предложенных дат и времени через модель TDateTime.

Странно то, что я вижу, что Active Record запускает проверки для всех четырех атрибутов, если все они пусты. Просто simple_form не выделяет свои пустые поля красным цветом с уведомлением «не может быть пустым».

Чтобы убедиться в этом, я добавил в свою форму строку «@treating.errors.full_messages...», которая возвращает четыре ошибки, если есть четыре пустых поля (скриншот внизу):

<% if @treating.errors.any? %>

<ul>
  <% @treating.errors.full_messages.each do |msg| %>
  <li><%= msg %></li>
  <% end %>
</ul>

  <div class="modal-header">
    <h3><%= @user.first_name + " " + @user.last_name[0] + "." %></h3>
    <p>
      <% if @user.picture_url %>
        <%= image_tag(@user.picture_url, :size => "30x30") %>
      <% else %>
        <%= image_tag('smiley_small.png', :size => "30x30") %>
      <% end %> 
      <%= @user.headline %>
    </p>
  </div>

    <div class="modal-body">
      <div class="row-fluid">
        <form action="#" class="span12">
          <label for="treating-message"><h5>Introduce yourself to <%= @user.first_name %> (sample introductions):</h5></label>

          <%= f.hidden_field :requestee_id %>

          <%= f.label :intro, "Introduce yourself to " + @user.first_name + ":" %>
          <%= f.input :intro %>

          <%= f.simple_fields_for :t_date_times_attributes, :validate => { :presence => true } do |t_date_time| %>
            <%= t_date_time.simple_fields_for :"0" do |zero| %>  
              <%= zero.input :date, :input_html => { :value => params[:treating][:t_date_times_attributes][:'0'][:date] } %>
              <%= zero.input :time, :input_html => { :value => params[:treating][:t_date_times_attributes][:'0'][:time] } %>
            <% end %>
          <% end %>
        </div>

        <input class="bigdrop" id="e7" placeholder="Pick a venue with foursquare..." name="proposed_venue[foursquare_id]" />

        </form>
      </div>
    </div>

    <div class="modal-footer">
        <div class="field">
        <a href="#" class="btn btn-link" data-dismiss="modal">Close</a>
        <%= f.submit "Send", id: "send-button" %>
        </div>
    </div>

<% else %>

<ul>
<% @treating.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>

  <div id="modal-treating" class="modal hide fade">
  <div class="modal-header">
    <h3><%= @user.first_name + " " + @user.last_name[0] + "." %></h3>
    <p>
      <% if @user.picture_url %>
        <%= image_tag(@user.picture_url, :size => "30x30") %>
      <% else %>
        <%= image_tag('smiley_small.png', :size => "30x30") %>
      <% end %> 
      <%= @user.headline %>
    </p>
  </div>

  <div class="modal-body">
    <div class="row-fluid">
      <form action="#" class="span12">
        <label for="treating-message"><h5>Introduce yourself to <%= @user.first_name %> (sample introductions):</h5></label>

        <%= f.hidden_field :requestee_id %>

          <%= f.label :intro, "Introduce yourself to " + @user.first_name + ":" %>
          <%= f.input :intro %>

          <div class="control-group">
            <%= f.simple_fields_for :t_date_times_attributes, :validate => { :presence => true } do |t_date_time| %>
              <%= t_date_time.simple_fields_for :"0", :validate => { :presence => true } do |zero| %>
                <%= zero.input :date, :validate => { :presence => true } %>
                <%= zero.input :time, :validate => { :presence => true } %>
              <% end %>
            <% end %>
          </div>            

      <input class="bigdrop" id="e7" placeholder="Pick a venue with foursquare..." name="proposed_venue[foursquare_id]" />

      </form>
    </div>
  </div>

  <div class="modal-footer">
      <div class="field">
      <a href="#" class="btn btn-link" data-dismiss="modal">Close</a>
      <%= f.submit "Send", id: "send-button" %>
      </div>
  </div>

</div>

<% end %>

введите здесь описание изображениявведите здесь описание изображения

(Все поля должны быть выделены красным в соответствии с сообщениями об ошибках в верхней части страницы, но только вводное поле [вероятно, потому что это единственный невложенный атрибут]).

Хотя я думал, что вся эта проблема могла быть связана с Ajax (обратите внимание на remote true в верхней части моей формы), это не так. У меня были те же результаты при перезагрузке новой страницы/отправке пустых полей.

В качестве примечания вы также можете видеть на картинке, что мое нижнее поле, предлагаемое место проведения, теряет свой стиль при перезагрузке Ajax (вся форма фактически теряет весь свой стиль). Это может быть совершенно другой вопрос, но если у кого-то есть какие-либо мысли о том, почему css/js будет удален при перезагрузке модальной формы ajax, я был бы рад узнать.

Я слишком долго бился с этим головой и думал, что обращусь за помощью к ТАК! Спасибо.


person keypulsations    schedule 29.11.2012    source источник


Ответы (1)


Это будет намного проще, если вы сделаете все это одной формой:

<%= simple_form_for @treating do %>
  <%= fields_for :t_date_times do %>
    <% # etc... %>

Каждый раз, когда вы пишете свои собственные теги формы... у вас будут плохие времена. Таким образом, SimpleForm может определить, из каких объектов он должен извлекать ошибки. В противном случае у него действительно нет никакого способа узнать.

http://railscasts.com/episodes/196-nested-model-form-part-1 — отличный канонический пример — он точно так же работает с SimpleForm.

person RobHeaton    schedule 03.05.2013