在Rails快捷方式中检查是否不为空,而不是空的?

我有一个显示页面为我的用户和每个属性应该只在该页面上可见,如果它不是零和不是一个空string。 下面我有我的控制器,这是非常烦人的编写相同的代码行@user.city != nil && @user.city != ""为每个variables。 我不太熟悉创build自己的方法,但我可以创build一个快捷方式来做这样的事情: @city = check_attr(@user.city) ? 还是有更好的方法来缩短这个程序?

users_controller.rb

 def show @city = @user.city != nil && @user.city != "" @state = @user.state != nil && @user.state != "" @bio = @user.bio != nil && @user.bio != "" @contact = @user.contact != nil && @user.contact != "" @twitter = @user.twitter != nil && @user.twitter != "" @mail = @user.mail != nil && @user.mail != "" end 

有一种方法可以为你做到这一点:

 def show @city = @user.city.present? end 

present? 方法testing是否有内容。 空string,由空格或制表符组成的string被认为不存在。

由于这种模式非常常见,所以ActiveRecord甚至还有一个快捷方式:

 def show @city = @user.city? end 

这大致相当。

作为一个说明,testingvs nil是几乎总是多余的。 Ruby中只有两个逻辑错误的值: nilfalse 。 除非一个variables可能是字面false ,否则这就足够了:

 if (variable) # ... end 

这比通常的if (!variable.nil?)if (variable != nil)偶尔出现的东西要好。 Ruby倾向于采取更简约的expression方式。

你想要比较nil一个原因是如果你有一个三态variables,可以是truefalsenil ,你需要区分最后两个状态。

你可以使用.present? 它包含在ActiveSupport中。

 @city = @user.city.present? # etc ... 

你甚至可以这样写

 def show %w(city state bio contact twitter mail).each do |attr| instance_variable_set "@#{attr}", @user[attr].present? end end 

值得注意的是,如果你想testing是否空白,你可以使用.blank? (这与.present?相反.present?

另外,不要使用foo == nil 。 使用foo.nil? 代替。