2010-06-16 4 views
0

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>&nbsp;</div><div id="container"> 
<%= link_to 'Add a transaction', '#transaction', :class => "add_nested_item", :rel => "transactions" %> 
</div> 
<div>&nbsp;</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: dans generate_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

Répondre

0

Je suggère d'utiliser un autre exemple, au lieu de cela. Je suis allé aussi à travers ce processus récemment et la meilleure implémentation est de ryan bates ceci: http://github.com/ryanb/complex-form-examples/tree/unobtrusive-jquery-deep

Si vous utilisez le prototype que vous n'êtes pas un problème, vous pouvez facilement changer l'implémentation au prototype de jquery.

+0

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. –

Questions connexes