to_xml 带有额外的方法,返回 Rails/ActiveRecord 中的哈希值

发布于 2024-10-31 09:45:18 字数 656 浏览 2 评论 0原文

我有一个类似这样的类:

class Product < ActiveRecord::Base

  # .... some stuff

  def prices
    # Make hash like { "Regular" => 10, "Discount" => 8 }
  end
end

我从数据库中获取它并在其上尝试 to_xml

Product.find(id).to_xml(:methods => [:prices])

但是如果价格失败,则哈希

... some XML
<prices>Regular10Discount8</prices>
... some more XML

to_json 按预期工作。

改变格式的最简单方法是什么,最终结果如下:

<prices>
  <price name="Regular">10</price>
  <price name="Discount">8</price>
</prices>

I have a class something like this:

class Product < ActiveRecord::Base

  # .... some stuff

  def prices
    # Make hash like { "Regular" => 10, "Discount" => 8 }
  end
end

I grab this from the database and try to_xml on it:

Product.find(id).to_xml(:methods => [:prices])

But if fails at the prices hash

... some XML
<prices>Regular10Discount8</prices>
... some more XML

to_json works as expected.

What's the easiest way to alter the format so it ends up as something like this:

<prices>
  <price name="Regular">10</price>
  <price name="Discount">8</price>
</prices>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冰火雁神 2024-11-07 09:45:18

我认为您需要自己进行 to_xml 格式化:

class Product < ActiveRecord::Base

  def prices 
    ...
  end

  def to_xml(options = {})
    super(options) do |xml|
      if prices.empty?
        xml.tag! 'prices' # empty tag
      else
        xml.prices do
          prices.each do |name, val|
            xml.price val, 'name' => name
          end
        end
      end
      yield(xml) if block_given?
    end
  end

end

而不仅仅是 Product.find(id).to_xml

I think You're left with doing the to_xml formatting Yourself :

class Product < ActiveRecord::Base

  def prices 
    ...
  end

  def to_xml(options = {})
    super(options) do |xml|
      if prices.empty?
        xml.tag! 'prices' # empty tag
      else
        xml.prices do
          prices.each do |name, val|
            xml.price val, 'name' => name
          end
        end
      end
      yield(xml) if block_given?
    end
  end

end

than just to a Product.find(id).to_xml

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文