在Rails视图中检查nil字符串

时间:2012-08-05 17:30:54

标签: ruby-on-rails ruby ruby-on-rails-3

我正在为我的Rails视图中的Nil检查寻找一个好的快捷方式。我已经看到了关于此的其他问题,但似乎没有人像我想的那样简化这一点。我想要的是一个简短的语法,如果特定值为nil,则返回空字符串"",否则返回该值。

有一个建议here,我倾向于尝试。它基本上允许这样的声明:

user.photo._?.url

- 或 -

user.photo.url._?

这是一个好主意还是充满了危险?

我的另一个选择是在我的模型上处理nils,但这似乎太全局了。

5 个答案:

答案 0 :(得分:5)

您应该检查在对象上运行提供的方法的try方法,并在相关对象不为nil时返回值。否则它只会返回nil。

实施例

# We have a user model with name field
u = User.first

# case 1 : u is not nil
u.try(:name)
=> Foo Bar

# case 2 : u is nil
u.try(:name)
=> nil

# in your case
user.photo.try(:url)

有关详细信息,请查看this blog post

答案 1 :(得分:3)

实现此目的的惯用Ruby方法是||运算符,如果左侧表达式为nil(或false),它将返回右侧表达式的值:

puts(user.photo.url || '')

任何经验丰富的Ruby程序员都能准确理解它的作用。如果你编写一个自定义_?方法,我现在必须去查找该方法的目的并记住它的作用,并希望它始终做正确的事情。我通常发现坚持使用惯用代码比在这里和那里保存一些键击更有益。

答案 2 :(得分:1)

试试这个:

user && user.photo && user.photo.url.present?

如果用户为nil或user.photo为nil

,则不会爆炸

答案 3 :(得分:0)

如何使用nil?

someObject.nil? # true if someOBj is nil

或者我误解了你想要的东西?

答案 4 :(得分:0)

我怀疑您的选项存在问题,因为如果照片为零,则您的两个语句都应返回“未定义方法”。

你甚至不需要检查'.nil?'。既然你暗示你的检查是在视图中,而不是在控制器中,我想你正在检查一个@instance变量,如果未定义则该变量总是为零。所以就这样做:

if @someObject
  ...
else
  ...

如果您将条件放入控制器中,那么再次使用@instance变量,如果未定义,则始终至少为nil。