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.