如何快捷嵌套子句

时间:2016-10-06 03:33:10

标签: ruby-on-rails ruby optimization

如何快捷或压缩这样的嵌套子句?

if @user.name.present?
  if @user.username.present?
    name = @user.name + @user.username
  else
    name = @user.name
  end
else
  name = ""
end

我想了一些连接两个字符串的方法(比如a = a + b)

1 个答案:

答案 0 :(得分:1)

name= @user.try(:name) ? "#{@user.name}#{@user.try(:username)}" : ""

如果您想要连接,无论是否缺少任何属性,您都可以在下面尝试。

name= "#{@user.try(:name)} #{@user.try(:username)}"

try方法返回值(如果存在)或nil值。此外,您可以使用try深入嵌套,而无需检查其存在。

在ruby中,使用Array来执行此操作。

[@user.name, @user.username].compact.join(" ")

这是示例

class User
    def name
        "john"
    end
    def username
        "doe"
    end
end
class NoUserName
    def name
        "john"
    end
    def username
        ""
    end
end
class NilUserName
    def name
        "john"
    end
    def username
        nil
    end
end
class NilUser
    def name
        nil
    end
    def username
        "Doe"
    end
end
class NoUser
    def name
        ""
    end
    def username
        "Doe"
    end
end
@user= User.new
puts [@user.name, @user.username].compact.join(" ").squeeze(' ').strip # "John Doe"
@user= NoUserName.new
puts [@user.name, @user.username].compact.join(" ").squeeze(' ').strip # "John"
@user= NilUserName.new
puts [@user.name, @user.username].compact.join(" ").squeeze(' ').strip # "John"
@user= NoUser.new
puts [@user.name, @user.username].compact.join(" ").squeeze(' ').strip # "Doe"
@user= NilUser.new
puts [@user.name, @user.username].compact.join(" ").squeeze(' ').strip # "Doe"