Имам модел, наречен "Лечение". По същество това е предложение за среща със заявител и получател, но също и (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="/bg#" 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="/bg#" 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, ще се радвам да знам.
Твърде дълго си блъсках главата с това и реших да потърся помощ от SO! Благодаря.