2011-02-07 10 views
29

Cuando se tiene un campo de formulario como el siguiente:¿Cómo obtengo el atributo 'nombre' HTML que generará un generador de formularios de rieles para un determinado campo?

<%= f.text_field :last_name %> 

que va a generar esto en HTML:

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

Me gustaría saber si hay alguna manera de obtener el atributo de nombre (en este caso "persona [last_name]") que se generará.

Parece una cosa extraña de querer obtener pero tengo mis razones! Tampoco me molesta lanzarme a una larga explicación también.

+2

Parece ser algo en la línea de "objeto [atributo]", ¿no? – LapinLove404

Respuesta

9

Bueno, como era de esperar, el comentario que se tiene es del todo cierto :)

El lugar de la fuente de donde esto sucede es la clase InstanceTag a la que todos los ejercicios de generación de la etiqueta hacia abajo. El método se llama tag_name.

+0

Realmente no sabía dónde buscar la información, gracias – LapinLove404

+1

¡Guau, gracias! Estaba a punto de sumergirme en la fuente también. Sé que es más o menos "objeto [atributo]", pero las cosas son mucho más complicadas cuando tienes formas de modelo anidadas, una de las razones por las que estaba buscando dicho método. – digitalWestie

1

La respuesta de Neutrino es genial. Solo quiero agregar lo que encontré, puede que no sea exactamente lo correcto. Pero funcionó para mí.

Buscar debajo de método en el ACTION_VIEW/ayudantes/form_tag_helper.rb

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

Espero que ayuda.

32

Después de inspeccionar el objeto de formulario, descubrí que puede obtener el object_name de él.

Así que esto ha funcionado bien para mí: "#{f.object_name}[field_name]"

que generará: object[object_attributes][0][field_name]

+0

Aún mejor, con Rails 4.0+, al usar la opción: como, puede especificar object_name cuando crea el formulario (siempre que no se inicialice con una cadena o símbolo). Por ejemplo, <% = form_for (@object, as: 'my_obj_name', ...) generará todos los campos como my_obj_name [field_name]. – Keith

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

También hay tag_name_with_index atributo que acepta índice como primer parámetro. Además, tanto tag_name como tag_name_with_index tienen el parámetro opcional multiple = false, que se utiliza para matrices (simplemente agrega [] al final del nombre generado).

Finalmente, existen métodos similares si necesita la identificación en lugar del nombre - tag_id y tag_id_with_index respectivamente.

+2

en Rails 4.2.0, sería 'ActionView :: Helpers :: tags :: Base.new ( ActiveModel :: Naming.param_key (@ object_in_form_for), : your_attribute, : Maniquí ) .send (: tag_name) ' – gabe

Cuestiones relacionadas