3

「治療」というモデルがあります。これは基本的に、要求者と被要求者による会議の提案ですが、(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に助けを求めると思っていました! ありがとう。

4

1 に答える 1