<% if defined?(@club.name) && !(@club.name).nil? %>
<%= @club.name %>
<% else %>
clubs:
<% end %>
第一行看起來很醜。任何幫助表示讚賞。簡單導軌代碼優化
<% if defined?(@club.name) && !(@club.name).nil? %>
<%= @club.name %>
<% else %>
clubs:
<% end %>
第一行看起來很醜。任何幫助表示讚賞。簡單導軌代碼優化
也許:
由於@club
將可能要麼被設置爲Club
對象或設置爲nil
,我們並不真正需要明確檢查@club
是否有一個name
方法。相反,我們可以測試@club
是否設置完成,而一個真實性測試就足夠了。
同樣,我們不需要在@club.name
上顯式nil
檢查。除false
和nil
以外的所有值都被認爲是「真實的」,並且由於俱樂部名稱可能不能設置爲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 %>
更漂亮:)
<%= @club.name || "clubs:" %>
如何關於那個?
你定義的含義是什麼?(@ club.name),你的意思是@ club.respond_to?(:name)? – 2010-12-22 19:47:47
@ pake007:我認爲這兩個構造在這裏是等價的,儘管`respond_to`確實更常見。 – Matchu 2010-12-22 19:50:53
@Matchu:我試過定義?(@俱樂部),返回「實例變量」,但定義?(@ club.name)返回我零,即使@ club.name有價值。怎麼了?我正在使用紅寶石1.9.2-p0 – 2010-12-22 19:57:16