Rails- content_tag anidado


84

Estoy tratando de anidar etiquetas de contenido en un asistente personalizado para crear algo como esto:

<div class="field">
   <label>A Label</label>
   <input class="medium new_value" size="20" type="text" name="value_name" />
</div>

Tenga en cuenta que la entrada no está asociada con un formulario, se guardará mediante javascript.

Aquí está el ayudante (hará más que solo mostrar el html):

module InputHelper
    def editable_input(label,name)
         content_tag :div, :class => "field" do
          content_tag :label,label
          text_field_tag name,'', :class => 'medium new_value'
         end
    end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

Sin embargo, la etiqueta no se muestra cuando llamo al ayudante, solo se muestra la entrada. Si comenta el text_field_tag, entonces se muestra la etiqueta.

¡Gracias!

Respuestas:


155

Necesita una +solución rápida: D

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      content_tag(:label,label) + # Note the + in this line
      text_field_tag(name,'', :class => 'medium new_value')
    end
  end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

Dentro del bloque de content_tag :div, solo se mostrará la última cadena devuelta.


1
Errata (en algún comentario, pero un poco confuso) - "No es un correo en el signo + en esta línea"
— Chowlett

Después de agregar eso, obtengo un error de sintaxis: error de sintaxis, tIDENTIFICADOR inesperado, esperando kDO o '{' o '(' text_field_tag ​​name, '',: class => 'medium new_value' ^
— christo16

2
Esto se siente sucio ... ¿es porque es un anti-patrón para un ayudante crear múltiples etiquetas de contenido?
— Erik Trautman

No funcionó para mí, tuve que usar concatcomo sugieren las otras respuestas
— Dex

55

También puede usar el método concat :

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      concat(content_tag(:label,label))
      concat(text_field_tag(name,'', :class => 'medium new_value'))
    end
  end
end

Fuente: anidado content_tag en Rails 3


Esto funcionó para mí siempre que la línea concat estuviera en 1 línea. Sin embargo, no pasé mucho tiempo jugando con él, así que probablemente haya una manera de hacerlo en varias líneas
— TerryS

esta será una mejor manera considerando el problema html_safe. el uso +entre cadenas no htmlsafe hará que todo no sea htmlsafe
— Tian Chen

Si está dentro de una clase de constructor de formularios, debería serlo@template.concat
— elquimista

Creo que es una forma más limpia de hacerlo +. Más legible y a Rubocop no le gusta+
— escanxr

2

Utilizo una variable y concat para ayudar con un anidamiento más profundo.

def billing_address customer
  state_line = content_tag :div do
    concat(
      content_tag(:span, customer.BillAddress_City) + ' ' +
      content_tag(:span, customer.BillAddress_State) + ' ' +
      content_tag(:span, customer.BillAddress_PostalCode)
    )
  end
  content_tag :div do
    concat(
      content_tag(:div, customer.BillAddress_Addr1) +
      content_tag(:div, customer.BillAddress_Addr2) +
      content_tag(:div, customer.BillAddress_Addr3) +
      content_tag(:div, customer.BillAddress_Addr4) +
      content_tag(:div, state_line) +
      content_tag(:div, customer.BillAddress_Country) +
      content_tag(:div, customer.BillAddress_Note)
    )
  end
end

1

La creación de etiquetas de contenido anidado con iteración es un poco diferente y me atrae cada vez ... aquí hay un método:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.