2010-08-14 11 views
8

Sto scrivendo un metodo di supporto Rails che aggiungerà wrapper HTML ai blocchi contenuti acquisiti e sostituire il metodo content_for, come ad esempioCome scrivere un helper in Ruby on Rails per catturare blocchi Haml?

- content_for :header do 
//haml code 

..would diventano

- content :header do 
//haml code 

Per fare questo sono usando blocchi Haml e Ruby. Questo è quello che sembra

def content(name,&block) 
content_for name do 
    capture_haml do 
    haml_tag "div",{:id=>name.to_s} do 
     haml_tag "div",{:id=>"#{name.to_s}_group"} do 
     block 
     end 
    end  
    end  
end 
end 

Ma non riesco a farlo funzionare. Non c'è nessun messaggio di errore. Semplicemente non mostra affatto il blocco! Non sono sicuro di cosa sto sbagliando. Gradirei una seconda opinione.

risposta

10

Stai facendo approssimativamente la cosa giusta, ma in realtà non stai chiamando il blocco #content. Per fare ciò, utilizzare block.call o l'istruzione yield integrata di Ruby.

0

basta cambiare questo

haml_tag "div",{:id=>"#{name.to_s}_group"} do 
    yield 
end 

a

haml_tag "div",{:id=>"#{name.to_s}_group"},&block 
+0

Questi due sono in realtà esattamente equivalenti nel comportamento. (La versione di '& block' potrebbe essere leggermente più performante, ma di questi tempi sono circa la stessa cosa.) Come @ nex3 sottolinea, però, l'OP non stava chiamando' yield', ma stava semplicemente restituendo il 'block' senza chiamandolo – Peeja