Ruby on Rails field_for Проблемы с помощником форм - PullRequest
3 голосов
/ 06 августа 2009

Я использую помощник формы field_for с циклом:

<% f.fields_for :permissions do |permission_form| %>
    <tr>
      <td><%= permission_form.object.security_module.name %><%= permission_form.hidden_field(:security_module_id) %></td>
      <td><%= permission_form.object.security_module.description %></td>
    <tr>
<% end %>

В результате вышеприведенный код выглядит так:

    <input id="role_permissions_attributes_0_id" name="role[permissions_attributes][0][id]" type="hidden" value="76" />
    <tr>
      <td>Diary<input id="role_permissions_attributes_0_security_module_id" name="role[permissions_attributes][0][security_module_id]" type="hidden" value="13" /></td>
       <td>Access to the Diary Module</td>
    </tr>
    <!-- next input field then <tr> tag -->

Проблема с этой разметкой состоит в том, что входной тег находится за пределами тега tr, который вызывает проблемы проверки с XHTML.

Кто-нибудь знает, как можно сделать так, чтобы тег ввода попал в тег tr, давая мне действительную разметку XHTML 1.0 STRICT?

Спасибо

Ответы [ 3 ]

4 голосов
/ 06 августа 2009

Если вы посмотрите на исходный код Rails, вы найдете это.

# in actionpack/lib/action_view/helpers/form_helper.rb
def fields_for_nested_model(name, object, args, block)
  if object.new_record?
    @template.fields_for(name, object, *args, &block)
  else
    @template.fields_for(name, object, *args) do |builder|
      @template.concat builder.hidden_field(:id)
      block.call(builder)
    end
  end
end

Обратите внимание, что здесь добавляется скрытое поле, и не похоже, что есть возможность изменить это поведение. Возможно, проще всего создать свой собственный конструктор форм.

# in lib/no_id_form_builder.rb
class NoIdFormBuilder < ActionView::Helpers::FormBuilder
  private
  def fields_for_nested_model(name, object, args, block)
    @template.fields_for(name, object, *args, &block)
  end
end

А затем используйте это в своей форме. Вам нужно будет добавить поле id вручную.

<% f.fields_for :permissions, :builder => NoIdFormBuilder do |permission_form| %>
  <tr>
    <td>
      <%= permission_form.object.security_module.name %>
      <%= permission_form.hidden_field(:security_module_id) %>
      <%= permission_form.hidden_field(:id) unless permission_form.object.new_record? %>
    </td>
    <td><%= permission_form.object.security_module.description %></td>
  <tr>
<% end %>

Возможно, вы захотите отправить билет на маяк. возможно, может быть :skip_id_field опция для fields_for, которая делает это.

2 голосов
/ 30 марта 2010

Начиная с 2.3.5 доступен обходной путь. Если вы явно поместите поле: id, оно не добавит его для вас:

<% form_for @foo do |f| %> 
<table> 
  <tbody> 
    <% f.fields_for :bars do |bf| %> 
      <tr>
        <td>
          <%= bf.hidden_field :id %>
          <%= bf.text_field :name %>
        </td> 
      </tr> 
    <% end %> 
  </tbody> 
</table> 
<% end %>

См https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3259

0 голосов
/ 15 сентября 2009

Небольшая коррекция:

Опция: builder должна указываться в форме для полей fields_for, а не fields_for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...