Wie bekommt man die Ruby on Rails generierte id eines form-Elements als Referenz in JavaScript?
Bei der Verwendung der form_for
Helfer und ein text_field
nennen, Ruby on Rails generiert eine eindeutige id für die <input />
element, das es gibt. Wie kann ich die erzeugen die gleiche id für die spätere Eingliederung in JavaScript erzeugt später?
<%= form_for @user do |f| %>
<%= f.text_field :username %>
<% end %>
Dann später in die Seite:
<%= javascript_tag do %>
$('<%= id of the :username field %>').doSomethingReallyCool();
<% end %>
- Ich möchte darauf hinweisen, dass die zusätzliche Beispiel in die bounty ist nur ein weiterer besonderer Fall, wo die Antwort nützlich sein wird. Es ist nicht eine andere Frage. Akzeptabel die Antwort sollte genug sein, für Allgemeine Zwecke zu passen sowohl die original-Beispiel und mir. Die beiden Beispiele zeigt einen Fall, wo es nötig ist, um "Ruby on Rails generierte id eines form-Elements als Referenz in JavaScript".
- Meta-Frage nach der aktuellen bounty meta.stackoverflow.com/q/351561/73226
- Nein, das ist nicht OK. Beachten Sie, dass der text von Ihr Kopfgeld ist nicht mehr sichtbar, nachdem die bounty ist abgelaufen oder vergeben. Eine Antwort, die Adressen der Frage in Ihrem bounty machen sehr wenig Sinn, nachdem die bounty ist verschwunden. Bitte stellen Sie eine neue Frage.
- Ich denke, Sie machen Bemerkungen, ohne zu verstehen, dass die beiden Beispiele sind zwei Besondere Fälle des gleichen Allgemeinen Fall. Der Autor gibt nur EIN Beispiel von "Ruby on Rails generierte id eines form-element" und ich gebe ein weiteres Beispiel. Beispiel A und Beispiel B. Aber die Frage ist "Wie bekommt man die Ruby on Rails generierte id eines form-Elements als Referenz in JavaScript?" und es ist noch immer fehlt eine anständige Antwort. Derzeit akzeptierte Antwort ("erstellen ein benutzerdefiniertes Formular-generator") gilt als schlechte Praxis heutzutage.
- Ist nicht das id-Namen-von-Modellname-von-der-Attribut? Und nicht Sie es nicht geben, eine id meine Angabe im html-Optionen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich landete erstellen Sie eine benutzerdefinierte form builder expose der Immobilie direkt
Dann legen Sie die Standard-Formular-generator
ActionView::Helpers::InstanceTag
sollte ersetzt werden, mitActionView::Helpers::Tags::Base
undInstanceTag.new(object_name, method, self, object)
sollteInstanceTag.new(object_name, method, self, options)
statt.Blick auf die Formular-generator-Optionen:
Optionen sollten mindestens die folgenden Daten enthalten: css-Klasse, id, http-Methode und Authentizität token.
<% f.submit "Save Changes", form: f.options[:html][:id] %>
. Nun können Sie javascript verwenden, um zu bewegen, die form, wohin Sie wollen, und es wird immer noch funktionieren, das Formular zu senden. So schön!Den Fall, dass jemand einen FormBuilder-Objekt aus einem
fields_for
block, seinenid
mit diesem snippet:FieldsForm#object_name
gibt die field-ID, so etwas wie dieses:user[address][0]
. Neben der regex-Ersetzung ändert sich Gruppen von einer oder mehreren Klammern durch Unterstriche. Diese substitution lässt am Ende einen Unterstrich, um die es fügt die Buchstabenid
. Für das Beispiel vor, diese Ergebnisse inuser_address_0_id
.Werden Sie wollen, geben Sie die id selbst. Hier erzeugen die id aus dem object_id der form garantiert, dass es keine Konflikte mit anderen text_field für Benutzernamen im Fall von verschachtelten Formen.
f.text_field
nennen.In Rails 4.1 ich war in der Lage, um die id mit dabei:
Es funktioniert auch mit verschachtelten Formen (
fields_for
).Ich weiß nicht wirklich, wie meine eigene Lösung, die viel, aber ich wollte nicht gehen und patch InstanceTag.
Leider bedeutete das die Aufhebung der code-Bereinigung von
ActionView::Helpers::InstanceTagMethods
Seit Ihren Javascript-code in einer ruby-Datei eingebettet (.erb), die wird vom server interpretiert, bevor Sie gesendet an den client-browser, können Sie generiert die erforderlichen JS-Variablen mit einem Rubin snippet wie:
und dann verwenden Sie es einfach als
$(id).doSomethingReallyCool();
.Wenn Sie die Kontrolle über den Wert der id, generiert durch die form in der ersten Instanz, können Sie es tun, übergeben Sie die id in der html-hash Optionen:
Wenn Sie eine unauffällige JS-Ansatz, den Sie möchten, platzieren Sie den JS-code in eine partielle (.js.erb) und habe den controller verwenden, wenn der client-Benutzer können JS. E. g.:
Dies ist die empfohlene Vorgehensweise heutzutage. Das problem ist jetzt, dass Sie brauchen, um passieren die Variablen auf Ihre JS-code. Wenn diese Variablen kam aus einem Formular, legen Sie Sie in günstiger versteckte Formularfelder. Und dann nutzen Sie die render -
locals
option zur Verfügung, die durch Ihre teilweise, wie in:Wenn der JS-code wird aktualisiert eine Vorlage, verwenden einige Variablen, die den gleichen Ansatz verwenden:
Ich gehe davon aus, dass es mehrere
form_for
in die Seite und jedes hat einen eigenen submit-button. Ich denke, das ist, wie ich dies tun:Haben einen versteckten Feld in der die form_for und setzen Sie den Wert für die id des input-Feldes. Hier habe ich gewählt
input_#{n}
wie die id des input-Feldes. Natürlich definiere ich die id für jeden Eingang.Dann auf submit, bekomme ich die id des form-Eingang in meinem params
params[:user][:input_id]
was ich kann, pass auf diejs.erb
mit derlocals
.Hoffe, das hilft 🙂