2009-12-17 4 views
5

J'ai une boîte de sélection où, en cas de changement, j'ai besoin de saisir la valeur et via la fonction distante obtenir des noms de champs de db puis générer ces champs plus bas dans le formulaire sur quelle option choisir. Le problème est que les champs sont dans un f.form_for sont donc en utilisant le formbuilder f qui a la boîte de sélection po Donc quand je rends le partial via ajax dans le contrôleur je reçois une erreur car je n'ai pas de référence au constructeur de formulaire local f.constructeur de formulaire de passage en fonction à distance dans les rails?

Est-ce que quelqu'un sait comment ou si je peux obtenir une référence au constructeur de formulaire ou si je peux le passer dans un appel de fonction à distance, puis passer dans mes locaux dans le partiel?

merci beaucoup, toute aide sera grande car elle a été collée sur cela depuis longtemps!

acclamations rick

Répondre

7

Je voudrais simplement réécrire votre partie pour ne pas utiliser le f. former des aides.

Do:

<%= text_field :object_name, :method_name %> 

Au lieu de:

<%= f.text_field :method_name %> 
+0

Cela a répondu à ma question ici: http://stackoverflow.com/questions/8821613/rails-lookup-table-with-dynamic-nested-forms – Karl

+0

Hey Karl, La question à laquelle vous avez lié est manquante. Pouvez-vous vous rappeler ce que c'était? J'ai exactement le même problème. Merci! –

18

J'ai eu le même problème et ma solution était de créer un autre générateur de formulaire pour le même objet et de le transmettre aux partials.

remote_action.js.erb:

'<%= form_for(@object) do |ff| %>' 
    $('#some_div').html("<%= j render(partial: 'some_partial', locals: {f: ff}) %>" 
'<% end %>' 

Il est important que l'étiquette form_for a des guillemets simples ou bien il y aura des problèmes javascript_escape.

+0

Super, fonctionne. Il manquait des parenthèses de fermeture sur le rendu partiel et j'ai dû enlever le "/" dans la première ligne. –

+0

Cela a fonctionné pour moi une fois que j'ai réalisé que par "@object" vous faites référence à une variable d'instance dans votre contrôleur (celui qui est invoqué pour AJAX) ... qui dans mon cas était @property (etc ...) Mine ressemblait ceci: vcavanna

+0

Hey, désolé si je ne veux pas assez clair ... –

0

Cet extrait ne cadrait pas bien dans les commentaires à une réponse différente ... il aide à illustrer le cas où le partiel est pour un modèle imbriqué, et est référencé dans une méthode/action à distance. Il montre aussi que mon interprétation littérale de @object était incorrect:

'<%= form_for([@property.agency,@property]) do |parent_form| %> ' '<%= parent_form.fields_for :address do |f| %>' $('#property_addresses').append("<%= j render(partial: 'common_partials/address', locals: {parent_form: f}) %>") '<% end %>' '<% end %>'

Notez que ceci est un @property, niché sous @ property.agency: où nous avons un fields_for niché sous form_for.

2

que je fais quelque chose de semblable à ce que Uri Klar a suggéré, mais sans passer les éléments de formulaire sous forme de chaînes au client, car ils ne sont pas nécessaires:

# create a form helper 'f' and store it in the variable form_helper. 

<% form_helper = nil %> 
<% form_for @object, url: '' do |f| %> 
<% form_helper = f %> 
<% end %> 

# pass form_helper to the form partial 

$('#element').html('<%= j render "form_element", f: form_helper %>'); 

Notez que form_helper = nil sur la première ligne est là pour définir la portée de la variable pour être au-delà de celle du bloc du formulaire.

Je pense que c'est une meilleure approche car elle n'expose pas le client à l'un de nos mécanismes internes, mais les conserve uniquement du côté serveur.