Comment obtenez-vous l'Ruby on Rails généré id d'un élément de formulaire de référence en JavaScript?
Lors de l'utilisation de la form_for
accompagnateur et un text_field
appel, Ruby on Rails, qui va générer un id unique pour le <input />
élément qu'il génère. Comment puis-je générer le même id pour l'inclusion ultérieure dans le JavaScript généré plus tard?
<%= form_for @user do |f| %>
<%= f.text_field :username %>
<% end %>
Puis plus tard dans la page:
<%= javascript_tag do %>
$('<%= id of the :username field %>').doSomethingReallyCool();
<% end %>
- Je tiens à souligner que l'exemple supplémentaire dans le bounty est juste un autre cas particulier où la réponse sera utile. Ce n'est pas une question différente. Pour être acceptable, la réponse doit être suffisamment général pour but de s'adapter à la fois l'exemple d'origine et de la mienne. Les deux exemples montre un cas où il est nécessaire d'obtenir un Ruby on Rails généré id d'un élément de formulaire de référence dans le JavaScript”.
- Meta question à propos de l'actuelle prime meta.stackoverflow.com/q/351561/73226
- Non, ce n'est pas OK. Gardez à l'esprit que le texte de votre générosité n'est plus visible après le bounty est expire ou est attribué. Une réponse qui répond à la question dans votre générosité fera très peu de sens après le bounty est allé. Veuillez poser une nouvelle question.
- Je pense que vous êtes de faire des commentaires, sans comprendre que ces deux exemples sont deux cas particuliers de la même le cas général. L'auteur donne juste UN exemple de “Ruby on Rails généré id d'un élément de formulaire” et je suis en train de donner un autre exemple. Exemple Un Exemple et B. Mais la question est “Comment obtenez-vous l'Ruby on Rails généré id d'un élément de formulaire de référence en JavaScript?”, et il manque toujours un décent réponse. Actuellement accepté de répondre (“création d'un formulaire personnalisé builder”) est considéré comme une mauvaise pratique de nos jours.
- N'est-ce pas le nom de l'id de model_name-de-la-attribut? Et tu ne peux pas ne pas lui donner un id de mon de le spécifier dans les options html?
Vous devez vous connecter pour publier un commentaire.
J'ai fini par créer un formulaire personnalisé générateur d'exposer directement l'établissement à l'
Puis définissez la valeur par défaut générateur de formulaire
ActionView::Helpers::InstanceTag
doit être remplacé parActionView::Helpers::Tags::Base
etInstanceTag.new(object_name, method, self, object)
devrait êtreInstanceTag.new(object_name, method, self, options)
à la place.Regarder le générateur de formulaire options:
Options doit comprendre au moins les données suivantes: css class, id, méthode http et l'authenticité de jeton.
<% f.submit "Save Changes", form: f.options[:html][:id] %>
. Maintenant, vous pouvez utiliser le javascript pour le déplacer où vous voulez, et il faudra encore travailler pour soumettre le formulaire. Tellement agréable!Au cas où quelqu'un a un FormBuilder objet à partir d'une
fields_for
bloc, sonid
à l'aide de cet extrait:FieldsForm#object_name
retourne le champ ID en tant que quelque chose comme ceci:user[address][0]
. Ensuite, la regex substitution des changements de groupes d'un ou de plusieurs supports à des traits de soulignement. Cette substitution des feuilles de suivi qui soulignent, à laquelle il ajoute les lettresid
. Dans l'exemple fourni avant, il en résulteuser_address_0_id
.Vous aurez envie de spécifier l'id de vous-même. Ici, la génération de l'id de la object_id de la forme garantit qu'il n'entre pas en conflit avec un autre text_field pour le nom d'utilisateur dans le cas d'imbrication des formes.
f.text_field
appel.Dans les Rails 4.1 j'ai été en mesure d'obtenir l'id avec ceci:
Il fonctionne avec des formulaires imbriqués (
fields_for
).Je n'aime pas vraiment ma propre solution, mais j'ai essayé de ne pas aller patch InstanceTag.
Malheureusement, cela signifiait que la levée de l'assainissement du code de
ActionView::Helpers::InstanceTagMethods
Depuis votre code Javascript est placé dans un ruby embarqué fichier (.erb) qui est interprété par le serveur avant d'être envoyé au navigateur client, vous pouvez généré le nécessaire JS variable avec un rubis extrait de comme:
et ensuite l'utiliser simplement comme
$(id).doSomethingReallyCool();
.Si vous avez besoin de contrôler la valeur de l'id généré par le formulaire en première instance, vous pouvez le faire en passant l'id dans le code html de hachage options:
Si vous utilisez une discrète JS approche, vous souhaitez placer le code JS dans une partielle (.js.erb) et le contrôleur de l'utiliser si le client utilisateur permet de JS. E. g.:
C'est l'approche recommandée de nos jours. Le problème est maintenant que vous devez passer les variables de votre code JS. Si ces variables sont à partir d'un formulaire, placez-les dans opportune cachée des champs de formulaire. Et puis utiliser le rendu est
locals
option pour les avoir à disposition par votre partielle, comme dans:Si le code JS est la mise à jour d'un modèle que l'utilisation de certaines variables, utilisez la même approche:
Je suppose qu'il y a plusieurs
form_for
dans la page et chacun a son propre bouton soumettre. Je pense que c'est comment je pourrais faire ceci:Ont un champ caché dans le form_for et de l'ensemble de la valeur de l'id du champ de saisie. Ici j'ai choisi
input_#{n}
comme l'id du champ de saisie. Bien sûr, je vais définir l'id pour chaque entrée.Ensuite sur "soumettre" je peux obtenir l'id de la forme d'entrée dans mon params
params[:user][:input_id]
qui je peux passer à lajs.erb
à l'aide de lalocals
.Espère que cela aide 🙂