2011-02-07 11 views
29

Quando hai un campo di modulo come questo:Come ottengo l'attributo 'nome' HTML che un generatore di formulari di righe genererà per un determinato campo?

<%= f.text_field :last_name %> 

genererà questo in HTML:

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

mi piacerebbe sapere se c'è un modo per ottenere l'attributo del nome (in questo caso "person [last_name]") che verrà generato.

Sembra una cosa un po 'strana da ottenere ma ho le mie ragioni! Inoltre non posso essere disturbato a lanciarmi in una lunga spiegazione.

+2

Sembra essere qualcosa nella linea di "oggetto [attributo]", no? – LapinLove404

risposta

9

Beh, come previsto, il commento che hai è del tutto vero :)

Il luogo nella sorgente in cui questo accade è la classe InstanceTag a cui tutti i trapani generazione di tag in giù. Il metodo è chiamato tag_name.

+0

Non sapevo davvero dove cercare le informazioni - grazie – LapinLove404

+1

Wow, grazie! Stavo per tuffarmi anche nella fonte. So che è praticamente un "oggetto [attributo]", ma le cose sono molto più complicate quando si hanno moduli di modelli annidati - uno dei motivi per cui stavo cercando un tale metodo. – digitalWestie

1

La risposta di Neutrino è ottima. Voglio solo aggiungere quello che ho trovato, potrebbe non essere esattamente giusto. Ma ha funzionato per me.

seguito troverete metodo action_view/aiutanti/form_tag_helper.rb

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

Speranza che aiuta.

32

Dopo aver ispezionato l'oggetto modulo, ho trovato che è possibile ottenere il object_name da esso.

Quindi questo ha funzionato bene per me: "#{f.object_name}[field_name]"

che genererà: object[object_attributes][0][field_name]

+0

Ancora meglio, con Rails 4.0+, utilizzando l'opzione: come, è possibile specificare object_name quando si crea il modulo (a condizione che non si inizializzi con una stringa o un simbolo). Ad esempio, <% = form_for (@object, as: 'my_obj_name', ...) genererà tutti i campi come my_obj_name [nome_campo]. – Keith

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

Inoltre v'è tag_name_with_index attributo che accetta indice come primo parametro. Inoltre, sia tag_name sia tag_name_with_index hanno il parametro opzionale multiple = false, che viene utilizzato per gli array (è sufficiente aggiungere [] alla fine del nome generato).

Infine, ci sono metodi simili se avete bisogno di id invece del nome - tag_id e tag_id_with_index rispettivamente.

+2

in Rails 4.2.0, sarebbe 'ActionView :: Helpers :: tags :: Base.new ( ActiveModel :: Naming.param_key (@ object_in_form_for), : your_attribute, : manichino ) Trasmettami (: tag_name) ' – gabe