0

我在 Rails 应用程序中编写了以下代码来生成 XML。我正在使用 Aptana IDE 进行 Rails 开发,IDE 显示一个警告,表明两个块中的代码结构相同。可以对代码进行哪些更改以消除结构中的重复性?有没有其他写法?

xml.roles do
    @rolesList.each do |r|
        xml.role(:id => r["role_id"], :name => r["role_name"])
    end
end

xml.levels do
    @levelsList.each do |lvl|
        xml.level(:id => lvl["level_id"], :name => lvl["level_name"])
    end
end
4

3 回答 3

1

我对@nathandva 有类似的想法,但正确使用了发送:

def list_to_xml(node_name, list)
  xml.send(node_name.pluralize.to_sym) do 
    list.each do |item|
      xml.send(node_name.to_sym, :id => r["#{node_name}_id"], 
               :name => r["#{node_name}_name"])
    end
  end
end

由于它增加了视觉复杂性,因此这种更改可能不是最好的。最大的问题是:如果你可能改变xml.roles结构,你也可能改变xml.levels吗?如果是这样,请务必删除重复项。将方法命名为在阅读时对您有意义的名称也很重要;补充一点,复杂性将减少而不是增加。

于 2009-12-03T15:40:14.473 回答
1

我在使用 send 方法和获取看起来像的标签时遇到了同样的问题<send:id>12</send:id>。为了解决这个问题,我使用了“标签!” 方法。所以我认为你的代码看起来像:

def build_xml(node_name, node_list)
  xml.tag!(node_name.pluralize) do
    node_list.each do |node|
      id_str = node["#{node_name}_id"]
      name_str = node["#{node_name}_name"]
      xml.tag!(node_name, :id => id_str, :name => name_str)
    end
  end
end
于 2010-06-14T14:20:39.460 回答
0

像这样的东西?

def build_xml(node_name, node_list)
  xml.send(node_name.pluralize) do
    node_list.each do |node|
      id_str = node["#{node_name}_id"]
      name_str = node["#{node_name}_name"]
      xml.send(node_name, :id => id_str, :name => name_str)
    end
  end
end

build_xml("role", @roleslist)
build_xml("level", @levelslist)

我正在尝试使用send而不是eval[我做得不好:对其进行编辑以纠正它——感谢 Kathy Van Stone]。

编辑 26/12 因为 xml 构建器将捕获发送并将其用作 xml 分支,有两个可能的选项,请改用发送方法,如下所示

      xml.__send__(node_name, :id => id_str, :name => name_str)

但我不确定它是否会创建一个<__send__:roles>。你总是可以退回到

      eval("xml.#{node_name} :id => '#{id_str}', :name => '#{name_str}'")

这绝对应该有效(但eval应该始终作为最后的手段)。

于 2009-12-03T09:27:05.300 回答