简单的rails代码优化

时间:2010-12-22 19:38:18

标签: ruby-on-rails ruby

<% if defined?(@club.name) && !(@club.name).nil? %>
<%= @club.name %>
<% else %>
clubs:
<% end %>

第一行看起来很难看。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

也许:

<% if @club && @club.name %>
  <%= @club.name %>
<% else %>
  clubs:
<% end %>

由于@club可能设置为Club对象或设置为nil,因此我们并不需要明确检查@club是否name有一个@club方法。相反,我们可以测试nil是否已设置,而真实性测试就足够了。

同样,我们不需要对@club.name进行明确的false检查。 nilfalse以外的所有值都被认为是“真实的”,并且由于俱乐部的名称可能无法设置为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:" %> 
那怎么样?