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="/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! Благодаря.


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