2010-09-01 51 views
3

我剛升級到Rails3,Ruby 1.9.2和最新的HAML gem。 用於工作這段代碼:HAML塊在yield上返回'0'嗎?


    = allowed? do 
    = link_to('New', new_video_path) 

現在allowed?產生0

,如果我做它的工作原理:


    = allowed?{ link_to('New', new_video_path) } 

是怎麼回事?

+0

是什麼讓?做還是回?允許使用 – corroded 2010-09-01 15:34:24

+0

?是我寫的一個寶石的幫手,RESTful_ACL。它會推斷出您要鏈接的URL,並根據模型級權限顯示它。它只是產生鏈接,或者根本沒有。 RESTful_ACL收到「0」,所以它肯定在HAML/Ruby級別。 – 2010-09-01 19:07:18

+0

我有同樣的問題。當我使用'do'傳遞一個塊(只是一個字符串)給我的幫助器方法時,然後'yield'給我'1'(Fixnum)而不是字符串,並且該字符串在輔助方法之前單獨呈現。但是,使用'{}'傳遞的塊可以正常工作。 – Andrei 2011-05-06 15:01:40

回答

0

你爲什麼首先回應那個輸出?你應該做的事:

- allowed? do 
    = link_to('New', new_video_path) 

一般情況下,你永遠要與塊使用輸出運算符(=)。以塊形式輸出的東西不會返回到塊;它直接連接到緩衝區。使用這樣的塊可能會導致內容亂序出現錯誤。

+1

我這樣做通常,但Rails 3與一個棄用錯誤抱怨... – 2010-09-01 18:03:34

0

這花了我一段時間才能發現,但是這是你怎麼做:

def wrap_in_div(&block) 
    "<div>#{capture_haml(&block)}</div>" 
end 

的問題是,HAML送它到機架或其他地方之前輸出一切自己特殊的緩衝區。所以你必須讓haml首先調用這個塊並緩衝它。

1

做這個收益率的概念,讓最乾淨的方式,你想正確地捕捉到任何內容爲:

= allowed? do 
    - capture_haml do 
    = link_to('New', new_video_path) 

在你的情況,不過,爲什麼不直接寫另一個助手方法?

def allowed_link_to(*args, &block) 
    opts = args.extract_options! 
    if allowed? args.last 
    link_to args.push(opts), &block 
    else 
    '' 
    end 
end 

而且使用這樣的:

= allowed_link_to('New', new_video_path) 
+0

絕對使用'capture_haml' ...凱利,你幫我解決這個http://ruby-on-rails-eq8.blogspot .co.uk/2014/10/yielding-haml-block-will-return-0-zero.html謝謝 – equivalent8 2014-10-23 09:05:43