У меня есть модель под названием «Лечение». По сути, это предложение о встрече с заказчиком и заказчиком, а также (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, я был бы рад узнать.
Я слишком долго бился с этим головой и думал, что обращусь за помощью к ТАК! Спасибо.