Rails- zagnieżdżony content_tag

84

Próbuję zagnieździć tagi treści w niestandardowym pomocniku, aby utworzyć coś takiego:

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

Zauważ, że dane wejściowe nie są powiązane z formularzem, zostaną zapisane za pomocą javascript.

Oto pomocnik (zrobi więcej niż po prostu wyświetli 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' %>

Jednak etykieta nie jest wyświetlana, gdy dzwonię do pomocnika, wyświetlane jest tylko wejście. Jeśli wykomentuje text_field_tag, zostanie wyświetlona etykieta.

Dzięki!

christo16
źródło

Odpowiedzi:

155

Potrzebujesz +szybkiej naprawy: 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' %>

Wewnątrz bloku content_tag :divzostanie wyświetlony tylko ostatni zwrócony ciąg.

PeterWong
źródło
1
Literówka (w komentarzu tylko, ale nieco mylące) - „Nie e znak + w tej linii”
Chowlett
Po dodaniu tego otrzymuję błąd składni: błąd składni, nieoczekiwany tIDENTIFIER, oczekuję kDO lub '{' lub '(' text_field_tag ​​name, '',: class => 'medium new_value' ^
christo16
2
To wydaje się brudne ... czy to dlatego, że jest to anty-wzorzec dla pomocnika do tworzenia wielu tagów treści?
Erik Trautman
Nie działało dla mnie, musiałem używać concattak, jak sugerują inne odpowiedzi
Dex
55

Możesz także użyć metody 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

Źródło: Zagnieżdżanie content_tag w Railsach 3

lmika
źródło
To działało dla mnie, o ile wiersz konkatacji był w 1 wierszu. Nie spędziłem jednak dużo czasu na zabawie z tym, więc prawdopodobnie jest sposób na zrobienie tego w wielu wierszach
TerryS
będzie to lepszy sposób, biorąc pod uwagę kwestię html_safe. stosując +między non-htmlsafe ciąg uczyni wszystko non-htmlsafe
Tian Chen
Jeśli jesteś w klasie konstruktora formularzy, powinno to być@template.concat
elquimista,
Myślę, że to czystszy sposób na zrobienie tego +. Bardziej czytelny, a Rubocop nie lubi+
escanxr
2

Używam zmiennej i concat, aby pomóc w głębszym zagnieżdżaniu.

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.
źródło
1

budowanie zagnieżdżonych tagów treści za pomocą iteracji jest trochę inne i dostaje mnie za każdym razem ... oto jedna metoda:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Sean M.
źródło