J'ai un problème avec les partiels imbriqués avec le code de générateur de formulaire dynamique (à partir de "complex form example" code on github) dans Rails. J'ai mon avis de haut niveau « nouveau » (où je tente de générer le modèle):Problème lors de l'utilisation du générateur de formulaire et de la manipulation DOM dans Rails avec plusieurs niveaux de partiels imbriqués
<% form_for (@transaction_group) do |txngroup_form| %>
<%= txngroup_form.error_messages %>
<% content_for :jstemplates do -%>
<%= "var transaction='#{generate_template(txngroup_form, :transactions)}'" %>
<% end -%>
<%= render :partial => 'transaction_group', :locals => { :f => txngroup_form, :txn_group => @transaction_group }%>
<% end -%>
Cela rend le transaction_group partiel:
<div class="content">
<% logger.debug "in partial, class name = " + txn_group.class.name %>
<% f.fields_for txn_group.transactions do |txn_form| %>
<table id="transactions" class="form">
<tr class="header"><td>Price</td><td>Quantity</td></tr>
<%= render :partial => 'transaction', :locals => { :tf => txn_form } %>
</table>
<% end %>
<div> </div><div id="container">
<%= link_to 'Add a transaction', '#transaction', :class => "add_nested_item", :rel => "transactions" %>
</div>
<div> </div>
... qui à son tour rend la transaction partielle:
<tr><td><%= tf.text_field :price, :size => 5 %></td>
<td><%= tf.text_field :quantity, :size => 2 %></td></tr>
Le code generate_template ressemble à ceci:
def generate_html(form_builder, method, options = {})
options[:object] ||= form_builder.object.class.reflect_on_association(method).klass.new
options[:partial] ||= method.to_s.singularize
options[:form_builder_local] ||= :f
form_builder.fields_for(method, options[:object], :child_index => 'NEW_RECORD') do |f|
render(:partial => options[:partial], :locals => { options[:form_builder_local] => f })
end
end
def generate_template(form_builder, method, options = {})
escape_javascript generate_html(form_builder, method, options)
end
(Il est évident que mon code n'est pas le plus élégant - je tentais d'obtenir cette chose partielle imbriquée ELABOREE premier.)
Mon problème est que je reçois une exception variable non définie de la transaction partielle lors du chargement de la vue:
/Users/chris/dev/ss/app/views/transaction_groups/_transaction.html.erb:2:in
_run_erb_app47views47transaction_groups47_transaction46html46erb_locals_f_object_transaction' /Users/chris/dev/ss/app/helpers/customers_helper.rb:29:in
generate_html » /Users/chris/dev/ss/app/helpers/customers_helper. rb: 28: dansgenerate_html' /Users/chris/dev/ss/app/helpers/customers_helper.rb:34:in
generate_template ' /Users/chris/dev/ss/app/views/transaction_groups/new.ht ml.erb: 4:_run_erb_app47views47transaction_groups47new46html46erb' /Users/chris/dev/ss/app/views/transaction_groups/new.html.erb:3:in
_run_erb_app47views47transaction_groups47new46html46erb ' /Users/chris/dev/ss/app/views/transaction_groups/new.html.erb:1:in_run_erb_app47views47transaction_groups47new46html46erb' /Users/chris/dev/ss/app/controllers/transaction_groups_controller.rb:17:in
nouveau'
Je suis assez c'est sûr parce que la boucle de do pour form_for n'a pas encore été exécutée (?) ... Je ne suis pas sûr que mon approche de ce problème soit la meilleure, mais je n'ai pas trouvé de meilleure solution pour ajouter dynamiquement former des partiels au DOM. Fondamentalement, j'ai besoin d'un moyen d'ajouter dynamiquement des enregistrements à un modèle has_many sur un formulaire imbriqué.
Toutes les recommandations sur un moyen de résoudre ce problème particulier ou (encore mieux!) Une solution plus propre sont appréciées. Merci d'avance.
Chris
Merci pour la suggestion. Je pense que vous avez raison, cette approche est plus facile. J'ai aussi trouvé une branche de Tim Riley ici http://github.com/timriley/complex-form-examples qui est beaucoup plus facile à suivre. –