Rails: content_tag annidato


84

Sto cercando di nidificare i tag di contenuto in un helper personalizzato, per creare qualcosa del genere:

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

Nota che l'input non è associato a un form, verrà salvato tramite javascript.

Ecco l'helper (farà di più che visualizzare solo l'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' %>

Tuttavia, l'etichetta non viene visualizzata quando chiamo l'helper, viene visualizzato solo l'input. Se commenta text_field_tag, viene visualizzata l'etichetta.

Grazie!

Risposte:


155

Hai bisogno di una +soluzione rapida: 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' %>

All'interno del blocco di content_tag :div, verrà visualizzata solo l'ultima stringa restituita.


1
Errore di battitura (solo nei commenti, ma leggermente confuso) - "Non e il + in questa riga"
Chowlett

Dopo averlo aggiunto, ottengo un errore di sintassi: errore di sintassi, tIDENTIFIER imprevisto, in attesa di kDO o '{' o '(' text_field_tag ​​name, '',: class => 'medium new_value' ^
christo16

2
Sembra sporco ... è perché è un anti-pattern per un aiutante che crea più tag di contenuto?
Erik Trautman

Non ha funzionato per me, ho dovuto usare concatcome suggeriscono le altre risposte
Dex

55

Puoi anche usare il metodo 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

Fonte: annidamento content_tag in Rails 3


Questo ha funzionato per me fintanto che la linea concat era su 1 linea. Non ho passato molto tempo a giocarci, quindi probabilmente c'è un modo per farlo su più righe
TerryS,

questo sarà un modo migliore considerando il problema html_safe. l'utilizzo +di una stringa non htmlsafe renderà tutto non htmlsafe
Tian Chen

Se ti trovi in ​​una classe di form builder, dovrebbe essere@template.concat
elquimista

Penso che sia un modo più pulito di farlo +. Più leggibile e Rubocop non piace+
escanxr

2

Uso una variabile e un concatenamento per aiutare con un annidamento più profondo.

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

costruire tag di contenuto nidificato con iterazione è un po 'diverso e mi fa ottenere ogni volta ... ecco un metodo:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.