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

时间:2014-04-09 17:41:32

标签: ruby-on-rails ruby

我有一个我的用户的显示页面,每个属性应该只在该页面上可见,如果它不是nil而不是空字符串。下面我有我的控制器,为每个变量编写相同的代码行@user.city != nil && @user.city != ""非常烦人。我不太熟悉创建自己的方法,但我可以以某种方式创建一个快捷方式来执行这样的操作:@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

2 个答案:

答案 0 :(得分:168)

有一种方法可以帮到你:

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

present?方法测试不是 - nil plus有内容。空字符串,由空格或制表符组成的字符串被认为不存在。

由于这种模式非常普遍,甚至还有ActiveRecord中的快捷方式:

def show
  @city = @user.city?
end

这大致相同。

作为一个说明,测试vs nil几乎总是多余的。 Ruby中只有两个逻辑上错误的值:nilfalse。除非变量可以是文字false,否则这就足够了:

if (variable)
  # ...
end

这比偶尔出现的if (!variable.nil?)if (variable != nil)内容更为可取。 Ruby倾向于使用更简化的表达式。

您希望与nil进行比较的一个原因是,如果您有一个三态变量,可以是truefalsenil,你需要区分最后两个状态。

答案 1 :(得分:11)

您可以使用ActiveSupport附带的.present?

@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

值得注意的是,如果您想测试某些内容是否为空白,则可以使用.blank?(这与.present?相反)

另外,请勿使用foo == nil。请改用foo.nil?