Entrada de nido dentro de f.label (generación de formulario de Rails)

Sin embargo, quiero usar el método f.label para crear mis tags de elementos de formulario: quiero que el elemento de formulario esté nested dentro de la etiqueta. es posible?

– Del W3C –

Para asociar una etiqueta con otro control implícitamente, el elemento de control debe estar dentro del contenido del elemento LABEL. En este caso, la ETIQUETA solo puede contener un elemento de control. La etiqueta en sí misma puede colocarse antes o después del control asociado.

En este ejemplo, implícitamente asociamos dos tags con dos controles de entrada de texto:

Puede anidar su ayudante de formulario dentro de una etiqueta usando un bloque. Aquí hay un ejemplo usando HAML, pero también funciona con ERB.

 = form_for your_resource do |f| = f.label :first_name do = f.text_field :first_name 

Como mencionó anteriormente Dan Garland, definitivamente puede anidar las entradas dentro de las tags con un simple bloque. Proporciono esta respuesta como ejemplo usando ERB y específicamente para mostrar exactamente cómo tiene que hacer que los grupos de botones de Bootstrap funcionen como botones de opción, ya que requieren este anidamiento. Me tomó un tiempo darme cuenta, así que espero que esto ayude a alguien más.

Para este ejemplo (Rails 4.2), el grupo de botones permite a un usuario seleccionar entre 3 opciones de distancia diferentes:

 < %= form_for(@location) do |f| %> 
< %= f.label :distance %>
< %= f.label :distance, class: "btn btn-primary active" do %> < %= f.radio_button :distance, 0.3, checked: true %> 0.3 miles < % end %> < %= f.label :distance, class: "btn btn-primary" do %> < %= f.radio_button :distance, 0.5 %> 0.5 miles < % end %> < %= f.label :distance, class: "btn btn-primary" do %> < %= f.radio_button :distance, 1 %> 1 mile < % end %>
< %= f.submit "Submit Location", class: "btn btn-success" %>
< % end %>

PD. Todavía no puedo publicar capturas de pantalla para mostrar cómo se ve, pero una vez que obtenga suficientes puntos de reputación, lo haré.

Puede usar un FormBuilder personalizado para permitir que el etiquetador acepte un bloque. Es tan simple como esto:

 class SmartLabelFormBuilder < ActionView::Helpers::FormBuilder def label(method, content_or_options_with_block = nil, options = {}, &block) if !block_given? super(method, content_or_options_with_block, options) else options = content_or_options_with_block.is_a?(Hash) ? content_or_options_with_block.stringify_keys : {} @template.content_tag(:label, options, &block) end end end 

Entonces puede usar su generador de formularios de esta manera:

 < % form_for(@article, :builder => SmartLabelFormBuilder) do |form| %> < % form.label(:title) do %> Title < %= form.text_field(:title) %> < % end %> < % end %> 

Usa esta pequeña solución

 < %= f.label(:content, "#{f.check_box(:allow_posts)}\n#{:content}\n".html_safe, :class => "checkbox") %> 

te dará esto

  

contenido

Esto no es posible utilizando la label Rails label_tag o los ayudantes label_tag porque no toman un bloque. Sin embargo, si quieres anidar, ¿por qué no usarías el elemento HTML directamente?