【问题标题】:Ruby on Rails: An optional argument makes me to repeat lines of codeRuby on Rails:一个可选参数让我重复代码行
【发布时间】:2013-03-17 17:52:20
【问题描述】:

我有以下代码片段:

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? 条件?

附:此片段使用 Nokogiri 形成 XML,并且没有“字符串”方法可供查看。

【问题讨论】:

    标签: ruby-on-rails optional-arguments


    【解决方案1】:

    我能想到的第一件事是预先准备参数哈希:

    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))
    }
    

    但也许存在更清洁的方法。

    【讨论】:

    • 为什么args[之间有空格?
    • 一个错字:) 谢谢你告诉我。
    【解决方案2】:

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

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

    方法二:使用点击构造选项

    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:预先创建选项

    查看答案above

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多