用条件插值

时间:2014-08-04 12:14:24

标签: ruby string-interpolation

我想通过插值将数据插入字符串。我想检查@call.transferred_from是否为nil,如果是,请输出@call.transfer_from_other;否则输出@call.transferred_from.try(:facility_name)以及@call.transferred_from.try(:facility_address)

这是我的代码示例:

"#{if @call.transferred_from.nil? @call.transfer_from_other else @call.transferred_from.try(:facility_name) @call.transferred_from.try(:facility_address) end}"

这样做会给我带来以下错误:

syntax error, unexpected keyword_else, expecting keyword_then or ';' or '\n'

我不知道该去哪儿。任何帮助将不胜感激。

更新:2014年4月8日

我将条件移动到私有控制器方法中,如下所示:

 def transfer_from_address
    if @call.transferred_from.nil?
      @call.transfer_from_other
    else
      @call.transferred_from.try(:facility_name) + ' ' + @call.transferred_from.try(:facility_address)
    end
  end

然后我使用字符串插值调用以下内容。

#{transfer_from_address}

这似乎有用,但我不确定它是否适合Ruby。

4 个答案:

答案 0 :(得分:2)

我知道这并没有真正回答你的问题,但我谨慎地将这么多逻辑放在插值中。虽然它完全可行,但它使您的代码很难理解。

我在你的特定问题上看到的根本问题是你试图以某种方式返回两件事,但你只是把它们放在彼此旁边,这是无效的红宝石。

假设这是插值,你想以某种方式将它们一起归还..

#{
  @call.transferred_from.nil? ?
  @call.transfer_from_other :
  @call.transferred_from.try(:facility_name) + ' ' + @call.transferred_from.try(:facility_address)
}

我真的建议你把它移到变量或方法中......然后在插值中引用它。

这看起来像是:

facility_name_and_address = @call.transferred_from.nil? ? @call.transfer_from_other : @call.transferred_from.try(:facility_name) + ' ' + @call.transferred_from.try(:facility_address)
{
  :body => facility_name_and_address
}

答案 1 :(得分:1)

如果我理解你要做什么,我会建议添加一个方法@call来完成这项工作:

class Call
  def transfer_text
    return transfer_from_other if transferred_from.nil?
    "#{transferred_from.try(:facility_name)} #{transferred_from.try(:facility_address)}"
  end
end

然后只需调用@call.transfer_text即可提供所需的文字。


如果您想要更复杂,并且您不希望在facility_namefacility_addressnil的情况下尾随空格,您可以创建它们的列表,并且用空格加入他们:

[transferred_from.try(:facility_name), transferred_from.try(:facility_address)].compact.join(' ')

这将确保空间仅在非零元素之间。如果两者都是nil,并且空字符串将是结果(而不是空格),并且如果一个是nil,则它将没有前导/尾随空格。

答案 2 :(得分:0)

你只需要在条件之后加上分号或then

if @call.transferred_from.nil?; @call.transfer_from_other ...

但是在你的情况下,将整个条件放在字符串插值中没有多大意义。最好在字符串之外做条件。

顺便说一句,如果您修复了第一个错误,那么您可能会遇到下一个错误:

@call.transferred_from.try(:facility_name) @call.transferred_from.try(:facility_address)

为了解决这个问题,我认为你应该这样做

@call.transferred_from.instance_eval{|e| e.nil? ?
  @call.transfer_from_other.to_s :
  "#{e.try(:facility_name)} #{e.try(:facility_address)}"
}

答案 3 :(得分:0)

为什么不使用

:body => "#{@call.transferred_from.nil? ? @call.transfer_from_other :    @call.transferred_from.try(:facility_name) @call.transferred_from.try(:facility_address)"

但无论如何我不会使用这种紧凑的语法来提高可维护性