在Rails快捷方式中检查是否非零且不为空?


76

我为用户提供了一个显示页面,并且每个属性仅在该页面上可见,如果它不是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

Answers:


197

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

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

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

由于这种模式非常普遍,因此ActiveRecord中甚至有一个快捷方式:

def show
  @city = @user.city?
end

这大致相等。

注意,测试vsnil几乎总是多余的。Ruby中只有两个逻辑错误的值:nilfalse。除非将变量设为文字false,否则就足够了:

if (variable)
  # ...
end

这比平时更好 if (!variable.nil?)if (variable != nil)偶尔出现的东西。Ruby倾向于使用一种更为简化的表达方式。

您想要与之比较的一个原因nil是,如果您有一个三态变量,可以是truefalse或者nil您需要区分最后两种状态。


11
请注意,从Ruby 2.3.0开始,您可以使用孤独的运算符摆脱许多多余的nil检查,诸如此类的东西if @user && @user.authenticated可以简单地变成if @user&.authenticated

1
你想要做的另一个原因if object.present?if object是如果以后换对象的装饰,结果会改变,除非你使用.present?philihp.com/2018/prefer-if-object-present-over-if-object.html
Philihp Busby

12

您可以使用.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

值得注意的是,如果您要测试是否为空白,可以使用.blank?(这与相反.present?

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


@ Mayank,OP将实例变量设置为true/ falsevalue。reciever.present?如果receiver为非空值,则将返回true 。请参阅我链接的文档以获取更多说明。
谢谢您

谢谢,我明白了你的意思,但是我不明白instance_variable_set“ @#{attr}”,@ user [attr] .present如何出现?将工作..?
2014年

@Mayankinstance_variable_set("@foo", "bar")与相同@foo = "bar"。这只是设置实例变量的一种编程方式^^
谢谢

好的,谢谢,现在我已经了解...但是还有一件事是javascript:atob(“ bmFreW90b0BnbWFpbC5jb20 =”); 是什么意思?
2014年

Mayank,在javascript控制台中运行以找出答案!
谢谢您
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.