Rails-verschachtelter content_tag


84

Ich versuche, Inhalts-Tags in einen benutzerdefinierten Helfer zu verschachteln, um Folgendes zu erstellen:

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

Beachten Sie, dass die Eingabe keinem Formular zugeordnet ist, sondern über Javascript gespeichert wird.

Hier ist der Helfer (er kann mehr als nur das HTML anzeigen):

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' %>

Die Beschriftung wird jedoch nicht angezeigt, wenn ich den Helfer anrufe, sondern nur die Eingabe. Wenn der text_field_tag ​​auskommentiert wird, wird die Beschriftung angezeigt.

Vielen Dank!

Antworten:


154

Sie benötigen eine +schnelle Lösung: 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' %>

Innerhalb des Blocks von content_tag :divwird nur die zuletzt zurückgegebene Zeichenfolge angezeigt.


1
Typo (in Kommentar nur, aber verwirrend leicht) - "Nicht e die + in dieser Linie"
— Chowlett

Nachdem ich das hinzugefügt habe, erhalte ich einen Syntaxfehler: Syntaxfehler, unerwarteter TIDENTIFIER, der kDO oder '{' oder '(' text_field_tag ​​name, '' ,: class => 'medium new_value' erwartet ^
— christo16

2
Das fühlt sich schmutzig an ... liegt das daran, dass es ein Anti-Muster für einen Helfer ist, mehrere Inhalts-Tags zu erstellen?
— Erik Trautman

Hat bei mir nicht funktioniert, musste concatwie die anderen Antworten vermuten lassen
— Dex

55

Sie können auch die concat- Methode verwenden:

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

Quelle: Verschachteln von content_tag in Rails 3


Dies funktionierte für mich, solange sich die Concat-Leitung in einer Leitung befand. Ich habe nicht lange damit gespielt, also gibt es wahrscheinlich eine Möglichkeit, es mehrzeilig zu machen
— TerryS

Dies ist ein besserer Weg, wenn man das Problem html_safe berücksichtigt. Die Verwendung +zwischen nicht-htmlsafe-Zeichenfolgen macht alles nicht-htmlsafe
— Tian Chen

Wenn Sie in einer Form Builder-Klasse sind, sollte es sein@template.concat
— elquimista

Ich denke, es ist eine sauberere Lösung als +. Besser lesbar und Rubocop mag nicht+
— escanxr

2

Ich benutze eine Variable und Concat, um bei der tieferen Verschachtelung zu helfen.

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

Das Erstellen verschachtelter Inhalts-Tags mit Iteration ist etwas anders und bringt mich jedes Mal dazu ... hier ist eine Methode:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.