2012-10-15 27 views
14

可能重複:
Checking if a variable is defined in Ruby呼應,如果變量在紅寶石/ ERB定義

使用傾斜的模板render方法,我通過在

#... t setup ... 
t.render(self, { :a => 'test', :b => 'again' }) 

在我template.erb

<%= a %> 
<%= b %> 

說我從傳遞給模板的散列中刪除:b。渲染將失敗,因爲:b未定義。

在PHP中,我可以去:

<?= isset($foo) ? $foo : '' ?> 

有沒有乾淨的方式(以紅寶石/ ERB),以 「回聲如果」?

我想<%= b.nil? ? b : '' %>但這顯然是錯誤的。任何幫助將不勝感激

+1

這會有幫助嗎? http://stackoverflow.com/questions/288715/checking-if-a-variable-is-defined-in-ruby –

+0

有幫助,但我想我的問題是特定於erb模板約定 – tester

回答

23

defined?是紅寶石相當於isset()

<% defined?(a) ? a : 'some default' %> 
12

如果你想,如果沒有定義a不顯示任何內容:

<%= a if defined?(a) %> 

而且你可以在你的部分的開始做的是設置一些默認爲a,如果它沒有定義。通過這種方式,您確信a不會在您身上發生崩潰,您無需測試它是否在任何地方定義。我個人更喜歡這種方式。

注意:如果您在將a設置爲false並將其傳遞給模板時,它將被重新分配至""

<% a ||= "" %> 
#Then do some things with it. No crash! 
<%= a %> 
<%= a*10 %> 
<%= "Here's the variable a value: #{a}" %> 
+0

'<%= a如果定義? %>'很棒!謝謝! – tester

+0

'nil?'不會安全,正確嗎? – tester

+0

如果沒有定義,你不能測試'a.nil?',它會崩潰。使用'defined?'來做到這一點。但是,只要您嘗試輸出它,您可以在上面的第二個示例中將'nil'分配給'a'。如果你想調用它的方法,它會崩潰...! –