2010-11-17 7 views
66

Ich versuche zu nisten Inhalt Tags in einen benutzerdefinierten Helfer, um so etwas zu schaffen:Rails- verschachtelt content_tag

<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 nicht mit einem Formular verknüpft ist, wird es über Javascript gespeichert werden . Hier

ist der Helfer (es wird mehr tun, als nur die HTML-Anzeige):

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

jedoch wird das Etikett nicht angezeigt, wenn ich die Helfer nennen, nur der Eingang angezeigt wird. Wenn das text_field_tag ​​auskommentiert wird, wird das Label angezeigt.

Danke!

Antwort

135

Sie benötigen einen + zu 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 :div, nur die letzte zurückgegebene Zeichenfolge angezeigt werden würde.

+1

Typo (in Kommentar nur, aber etwas verwirrend) - "Not * e * die + in dieser Zeile" – Chowlett

+0

Nach der Zugabe von dass in, erhalte ich Syntaxfehler: Syntaxfehler, unerwarteten TIdentifier, erwarte KDO oder '{' oder '(' \t \t text_field_tag ​​Namen, '',: class => 'Medium new_value' \t \t^ – christo16

+0

Ich habe die Antwort aktualisiert, ob das OK ist. – PeterWong

42

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: Nesting content_tag in Rails 3

+0

Dies funktionierte für mich, solange die Concat-Linie auf 1 Linie war. Ich habe nicht lange damit verbracht, damit zu spielen, also gibt es wahrscheinlich einen Weg, es mehrzeilig zu machen – TerryS

+0

Dies wird ein besserer Weg sein, wenn man das Problem html_safe betrachtet. die Verwendung von '+' zwischen nicht-htmlsafe-Strings macht alles nicht-htmlsafe –