2011-12-29 17 views
3

我有一個HAML模板,我想渲染並可選地提供一個局部變量,在這裏稱爲post,以便它使用提供的變量作爲元素屬性的值,或者回退到顯式默認值。如何在HAML中爲當地人使用默認值?

下面的代碼顯示了我的意思,但如果沒有提供post,它將無法運行。有沒有一個乾淨的解決方案?我有相當多的這些領域,我寧願不必與- if defined?聲明保持重複,這是我能想到的唯一另一種選擇。

%label 
    Post title 
    %input{:name => "title", 
     :value => (defined? post) ? post.title : ""} } 
+1

在一個帶有可選變量的erb partial中,我通常只會說'post || = nil'。然後,您可以執行條件邏輯,而不會觸及未定義的變量異常。 – 2011-12-29 00:44:45

回答

0

啊,事實證明,真正的問題是,這是在Sinatra中,它定義了一個定義HTTP帖子處理程序的方法post,HAML渲染器可以看到這個。

如果你提供了一個post變量,它隱藏它的渲染器,所以模板工作正常,但在其他方面post實際上是一個功能,所以defined?是真實的,但顯然沒有title財產。

只是更改變量的名稱,使一切正常,如我所料。

+0

很高興你知道了。我應該想到這一點。 – Batkins 2011-12-29 03:06:51

1

試試這個這樣做:

%input{:name => "title", :value => post ? post.title : ""} 

你並不需要檢查與定義,因爲nil被作爲Ruby解釋假處理。這從Eloquent Ruby by Russ Olsen摘錄最好的形容:

在Ruby中,只有falsenil作爲false處理。 Ruby對待所有其他事物 - 我的意思是所有事情 - 如true

如果這是一個Rails應用程序,更雄辯的解決辦法是使用Rails的try方法:

%input{:name => "title", :value => post.try(:title)} 

try方法調用的則傳遞中的類,除非符號標識的方法該類本身是nil,在這種情況下,它將返回nil(haml將自動轉換爲空字符串)。 Read more about the rails try method here

0

如果你只是想處理一些變量爲零的情況,你可以使用try方法。例如:

%input{:name => "title", :value => post.try(:title) } } 

當post爲零時,它只返回nil;否則返回post.title。

然而,如果要提供明確的默認值,那麼應該寫一個助手(類似default_if_nil)或猴子修補try方法,使其能夠指定默認值。

+0

只是FYI,這在sinatra應用程序中不起作用,因爲它是一種被添加到「Rails」的類中的方法。該方法在Ruby或Sinatra中不存在。查看我答案的底部,瞭解更多細節。 – Batkins 2011-12-29 03:05:51

相關問題