2010-11-17 5 views
66

Próbuję gniazdo tagów do treści do niestandardowych pomocnika, aby stworzyć coś takiego:Rails- zagnieżdżona content_tag

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

pamiętać, że wejście nie jest związana z formą, zostanie on zapisany poprzez javascript .

Oto pomocnik (będzie zrobić więcej niż tylko wyświetlać 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 zgłoszę pomocnika, wyświetlana jest tylko wejście. Jeśli skomentuje text_field_tag, wyświetli się etykieta.

Dzięki!

Odpowiedz

135

Musisz + do szybkiej i taniej: 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 :div, będzie wyświetlana tylko ostatni zwrócony ciąg.

+1

literówka (w komentarzu tylko, ale nieco mylące) - "Nie * e * przycisk + w tej linii" – Chowlett

+0

Po dodaniu że otrzymuję błąd składni: błąd składni, nieoczekiwany tIDENTIFIER, oczekując KDO lub '{' lub '(' \t \t nazwę text_field_tag, '': class => 'średni NEW_VALUE' \t \t^ – christo16

+0

Zaktualizowałem odpowiedź, zobacz, czy to w porządku. – PeterWong

42

Można również 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: Nesting content_tag in Rails 3

+0

To działało dla mnie tak długo, jak linia concat była na 1 linii. Nie spędziłem jednak długiej gry z nim, więc prawdopodobnie istnieje sposób na zrobienie tego multi-line – TerryS

+0

to będzie lepszy sposób, biorąc pod uwagę problem html_safe. użycie '+' między ciągiem innym niż htmlsafe spowoduje, że wszystko będzie inne niż htmlsafe –