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!

christo16
quelle

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.

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

lmika
quelle
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
Sean M.
quelle
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
Sean M.
quelle