「治療」というモデルがあります。これは基本的に、要求者と被要求者による会議の提案ですが、(1) :intro (2) :proposed_venue (3) :proposed_date (4) :proposed_time.
これらの 4 つの属性 (そのうちの 3 つはネストされた属性) は、フォームのフィールドとして表示されます。すべての属性には validates_presence_of 検証がありますが、インストールした simple_form gem ( https://github.com/plataformatec/simple_form ) によって検証されるのは :intro フィールドだけです。これは、(上記の 4 つのうち) :intro 属性のみが治療モデルの属性であるためです。A Treating には、Venue モデルを介して多くの提案された会場があり、TDateTime モデルを介して多くの提案された日付と時刻があります。
奇妙なことに、4 つの属性がすべて空白の場合、Active Record によって検証がトリガーされていることがわかります。simple_form が空白のフィールドを「空白にすることはできません」という通知で赤く強調表示していないだけです。
これを確認するために、"@treating.errors.full_messages..." 行をフォームに追加しました。これにより、4 つの空白フィールドがある場合に 4 つのエラーが適切に返されます (下部のスクリーンショット)。
<% 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 モーダル フォームのリロードでドロップされるのかについて何か考えがある場合は、喜んでお知らせします。
私はこれに対してあまりにも長い間頭を悩ませてきたので、SOに助けを求めると思っていました! ありがとう。