1

我有以下代码片段:

if my_string.comment.blank?
  xml.string(:name => my_string.name) {
    xml.text(variation_value(my_string, variation_id))
  }
else
  xml.string(:name => my_string.name, :comment => my_string.comment) {
    xml.text(variation_value(my_string, variation_id))
  }
end

我不喜欢这里两次提到 xml.string 及其块。这怎么可能改写?

是否可以重写为有两个不同的 xml.string 调用,但对它们都使用一个块?

或者可以:comment => my_string.comment通过或不通过,取决于my_string.comment.blank?条件?

PS 这个片段使用 Nokogiri 来形成 XML,并且没有“字符串”方法可以查看。

4

2 回答 2

2

我能想到的第一件事是事先准备参数散列:

args = {:name => my_string.name}
args[:comment] = my_string.comment unless my_string.comment.blank?

xml.string(args) {
  xml.text(variation_value(my_string, variation_id))
}

但也许存在一种更清洁的方式。

于 2013-03-27T15:21:00.753 回答
1

方法一:使用合并构造选项

xml.string(
  {:name => my_string.name}.merge(
    my_string.comment.present? ? {:comment => my_string.comment} : {}
  )
){
  xml.text(variation_value(my_string, variation_id))
}

方法 2:使用 Tap 构建选项

xml.string(
  {:name => my_string.name}.tap { |o| 
    o[:comment] = my_string.comment if my_string.comment.present? 
  }
){
  xml.text(variation_value(my_string, variation_id))
}

方法 3:预先创建选项

看上面的答案

我更喜欢方法3,然后是2。

于 2013-03-27T15:56:25.550 回答