Ruby 中的多个条件语句执行

Multiple Conditional Statement Execution in Ruby

以下语句如果内容不为nil则需要评估并提交。接收端不接受nil值。

  :customer => {
    if !@transaction.name.nil? :first_name => @transaction.nome,
    if !@transaction.last_name.nil? :last_name => @transaction.last_name,
    if !@transaction.nation_id.nil? :country_name => @transaction.nation.name
    },

没有条件,一个简单的语句 :first_name => @transaction.nome, 被正确评估,并且带有方括号和逗号的语法是正确的。但是,条件的引入会在 nil 值的情况下创建空白并生成 语法错误 unexpected '}'.

如何克服这个问题?

一种方法是构建散列:

h = {}
if @transaction.name      !=nil then h[:first_name]   = @transaction.name        end
if @transaction.last_name !=nil then h[:last_name]    = @transaction.last_name   end
if @transaction.nation_id !=nil then h[:country_name] = @transaction.nation.name end
:customer => h

如果你知道你的项目总是真实的或零,从不虚假,那么这更短:

if @transaction.name      then h[:first_name]   = @transaction.name        end
if @transaction.last_name then h[:last_name]    = @transaction.last_name   end
if @transaction.nation_id then h[:country_name] = @transaction.nation.name end

您可以简单地添加值,然后过滤掉它们。将使您免于所有这些检查:

:customer => {
    :first_name => @transaction.nome,
    :last_name => @transaction.last_name,
    :country_name => @transaction.nation.try(:name)
 }.reject{ |_, v| v.nil? }

你可以通过添加一个小的 lambda 来消除一些重复

customer: {}.tap { |h|
  conditional_store = -> key, value { h.store(key, value) unless value.nil? }
  conditional_store[:firstName,    @transaction.name]
  conditional_store[:last_name,    @transaction.last_name]
  conditional_store[:country_name, @transaction.nation.name]
}