2010-12-22 92 views
0
<% if defined?(@club.name) && !(@club.name).nil? %> 
<%= @club.name %> 
<% else %> 
clubs: 
<% end %> 

第一行看起來很醜。任何幫助表示讚賞。簡單導軌代碼優化

+0

你定義的含義是什麼?(@ club.name),你的意思是@ club.respond_to?(:name)? – 2010-12-22 19:47:47

+0

@ pake007:我認爲這兩個構造在這裏是等價的,儘管`respond_to`確實更常見。 – Matchu 2010-12-22 19:50:53

+0

@Matchu:我試過定義?(@俱樂部),返回「實例變量」,但定義?(@ club.name)返回我零,即使@ club.name有價值。怎麼了?我正在使用紅寶石1.9.2-p0 – 2010-12-22 19:57:16

回答

1

也許:

​​

由於@club將可能要麼被設置爲Club對象或設置爲nil,我們並不真正需要明確檢查@club是否有一個name方法。相反,我們可以測試@club是否設置完成,而一個真實性測試就足夠了。

同樣,我們不需要在@club.name上顯式nil檢查。除falsenil以外的所有值都被認爲是「真實的」,並且由於俱樂部名稱可能不能設置爲false,因此只需測試它的真實性就等於明確檢查其是否爲nil


紫指出了意見,這實際上是在Rails社區相當常見的成語,所以快捷方式確實存在。在Rails環境中,所有對象(包括nil)都有一個名爲try的方法。 try調用傳遞給它的方法名稱作爲參數,並返回該方法的返回值,如果該方法未定義,則返回nil

所以,例如:

no_name = Club.new 
no_name.try(:name) # => nil 

so = Club.new :name => 'StackOverflow' 
so.try(:name) # => "StackOverflow" 

nil.try(:name) # => nil 

這樣,下面是完全等效於所述第一代碼塊:

<% if @club.try(:name) %> 
    <%= @club.name %> 
<% else %> 
    clubs: 
<% end %> 

更漂亮:)

0
<%= @club.name || "clubs:" %> 

如何關於那個?