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 とそのブロックが 2 回言及されていることです。これはどのように書き換えることができますか?

2 つの異なる xml.string 呼び出しを持つように書き直すことができますが、両方に対して 1 つのブロックを使用できますか?

それとも条件: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

アプローチ 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: タップを使用してオプションを構築する

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 に答える