在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中只有两个逻辑错误的值: nil
和false
。 除非一个variables可能是字面false
,否则这就足够了:
if (variable) # ... end
这比通常的if (!variable.nil?)
或if (variable != nil)
偶尔出现的东西要好。 Ruby倾向于采取更简约的expression方式。
你想要比较nil
一个原因是如果你有一个三态variables,可以是true
, false
或nil
,你需要区分最后两个状态。
你可以使用.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?
代替。