Если вы посмотрите на исходный код 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
, которая делает это.