<% if defined?(@club.name) && !(@club.name).nil? %>
<%= @club.name %>
<% else %>
clubs:
<% end %>
第一行看起来很难看。任何帮助表示赞赏。
答案 0 :(得分:1)
也许:
<% if @club && @club.name %>
<%= @club.name %>
<% else %>
clubs:
<% end %>
由于@club
可能设置为Club
对象或设置为nil
,因此我们并不需要明确检查@club
是否name
有一个@club
方法。相反,我们可以测试nil
是否已设置,而真实性测试就足够了。
同样,我们不需要对@club.name
进行明确的false
检查。 nil
和false
以外的所有值都被认为是“真实的”,并且由于俱乐部的名称可能无法设置为nil
,因此仅仅测试其真实性等同于明确检查是否它是nil
。
Violet在评论中指出,这实际上是Rails世界中一个相当普遍的习惯用法,所以实际上存在一条捷径。在Rails环境中,所有对象(包括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 %>
因此,以下内容与第一个代码块完全等效:
{{1}}
更漂亮:)
答案 1 :(得分:0)
<%= @club.name || "clubs:" %>
那怎么样?