2011-02-07 10 views
29

Gdy masz pole formularza takie jak to:W jaki sposób mogę uzyskać atrybut "nazwa" HTML, który zostanie wygenerowany przez kreator formularzy szyn dla określonego pola?

<%= f.text_field :last_name %> 

wygeneruje to w HTML:

<input id="person_last_name" name="person[last_name]" size="30" type="text" /> 

Chciałbym wiedzieć, czy jest jakiś sposób, aby uzyskać atrybut name (w tym przypadku "osoba [last_name]"), która zostanie wygenerowana.

To chyba trochę dziwna rzecz, ale chcę mieć powody! Nie mogę też zawracać sobie głowy robieniem zbyt długiego wyjaśnienia.

+2

Wydaje się, że coś jest w linii "obiektu [atrybut]", nie? – LapinLove404

Odpowiedz

9

Cóż, zgodnie z oczekiwaniami, komentarz masz jest dość prawdziwe :)

miejsce w źródle, gdzie to się dzieje, jest klasa InstanceTag do którego wszystkie wiertarki generacji tag w dół. Ta metoda nazywa się tag_name.

+0

Nie bardzo wiedziałem, gdzie szukać informacji - dziękuję – LapinLove404

+1

Wow, dziękuję! Właśnie chciałem zanurkować w źródło. Wiem, że to w zasadzie "obiekt [atrybut]", ale rzeczy są o wiele bardziej skomplikowane, gdy masz zagnieżdżone formularze modelowe - jeden z powodów, dla których szukałem takiej metody. – digitalWestie

1

Odpowiedź Neutrino jest świetna. Chcę tylko dodać to, co znalazłem, może nie być dokładnie. Ale zadziałało to dla mnie.

Poniżej znajdują się metody w action_view/pomocników/form_tag_helper.rb

def sanitized_object_name 
     @sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") 
    end 

Nadzieję, że to pomaga.

32

Po sprawdzeniu obiektu formularza stwierdziłem, że można pobrać z niego object_name.

Tak to działa dobrze dla mnie: "#{f.object_name}[field_name]"

które będą generować: object[object_attributes][0][field_name]

+0

Co więcej, z Railsami 4.0+, używając opcji: as, możesz określić object_name podczas tworzenia formularza (o ile nie zainicjalizujesz go ciągiem lub symbolem). Na przykład <% = form_for (@ object, as: 'my_obj_name', ...) wygeneruje wszystkie pola jako moja_nazwa_name [nazwa_pola]. – Keith

3
ActionView::Helpers::InstanceTag.new(
    ActiveModel::Naming.param_key(@object_in_form_for), 
    :your_attribute, 
    :this_param_is_ignored 
).send(:tag_name) 

Ponadto istnieje tag_name_with_index atrybut, który akceptuje Index jako pierwszy parametr. Również oba tag_name i tag_name_with_index mają opcjonalny parametr multiple = false, który jest używany do tablic (tylko dodaje [] na końcu generowanej nazwy).

Wreszcie, istnieją podobne metody, jeśli potrzebujesz id zamiast nazwy - tag_id i tag_id_with_index odpowiednio.

+2

w Rails 4.2.0, byłoby 'actionView :: Pomocnicy :: tagi :: Base.new ( ActiveModel :: Naming.param_key (@ object_in_form_for) : your_attribute, : manekin ) .send (: nazwa_znacznika) ' – gabe