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.