0

Railsアプリで次のコードを記述してXMLを生成しました。Rails開発を行うためにAptanaIDEを使用していますが、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 と同様の考えを持っていましたが、send を適切に使用しています。

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)

[これはうまくいきませんでした: 編集して修正しました -- Kathy Van Stone に感謝します]sendの代わりに使用しようとしています。eval

編集 26/12 xml ビルダーは送信をキャプチャし、それを xml ブランチとして使用するため、2 つの可能なオプションがあり、代わりに次のようにsendメソッドを使用します。

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