2011-06-22 2 views
0

J'ai un problème similaire mais pas tout à fait le même que celui que j'ai vu beaucoup discuté. Je veux juste mettre ceci dehors au cas où n'importe qui a n'importe quel aperçu sur cette situation particulière. J'ai une série de boîtes de sélection et après que le dernier d'entre eux a été sélectionné, je veux mettre à jour un text_field avec du texte basé sur ce qui précède.replace_html dans Ruby on Rails génère TypeError

je le code suivant à mon avis (en fait dans une partie) pour la zone de sélection:

<%= f.collection_select :xyz_id, @xyzs, :id, :display_name, 
         { :prompt => "Select a XYZ..." }, 
         { :onchange => "#{remote_function(:url => {:action => "update_text_field"}, 
                  :with => "'abc_id='+$('#foo_abc_id').val()")}", 
          :class => "blah" } %> 

La méthode update_text_field dans le contrôleur fait son travail et appelle replace_html comme ceci:

some_info = foo.bar.first(:order => "id DESC").name 

render :update do |page| 
    page.replace_html 'myDivId', :partial => "shared/my_partial", :locals => { :some_info => some_info } 
end 

Enfin, my_partial ressemble à ceci:

<%= text_field_tag :special_info, some_info, :size => 20, :readonly => "readonly" %> 

La partie qui contient cette partie a ceci:

<div id="myDivId"><%= render :partial => 'shared/my_partial', 
      :locals => { :some_info => some_info } %></div> 

Effectué, tout fonctionne bien jusqu'à ce que le replace_html qui jette une erreur RJS:

RJS error:

TypeError: Result of expression 'element.getElementsByTagName' [undefined] is not a function

Suivi par:

Element.update("myDivId", 
"<input id=\"special_info\" 
name=\"special_info\" 
readonly=\"readonly\" size=\"20\" 
type=\"text\" value=\"The right text\" 
/>"); 

Tous des idées sur la cause de cette erreur?

Répondre

0

J'ai ceci fonctionnant maintenant.

Leçons:

  1. Utilisez rendre: au lieu de rendre partielle: mise à jour dans le contrôleur
  2. Utilisez JS discret pour émettre une requête GET au contrôleur
  3. Utilisation: distance => true sur la forme
  4. ne cherchez pas des solutions ou expérience la nuit lorsque vous avez travaillé pour les 12+ dernières heures

L'un Bove List semble définitivement être "suffisant", mais je ne suis pas sûr si tout est là "nécessaire", mais je vais continuer en utilisant la liste ci-dessus pour tous les autres champs d'entrée dynamique sur mon formulaire.