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!

christo16
fuente

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.

PeterWong
fuente
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

lmika
fuente
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
Sean M
fuente
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
Sean M
fuente