3

我正在尝试获取活动记录结果列表,以显示为供 iphone 使用的 plist。我正在使用 plist gem v 3.0。

我的模型称为 Post。我希望 Post.all(或任何数组或 Posts)正确显示为 Plist。

我让它在一个 Post 实例上运行良好:[ http://pastie.org/580902][1]

这是正确的,我所期望的。为了获得这种行为,我必须这样做:

class Post < ActiveRecord::Base
   def to_plist
     attributes.to_plist
   end
end

但是,当我执行 Post.all 时,我无法让它显示我想要的内容。这是发生了什么: http: //pastie.org/580909

我得到编组。我希望输出更像这样:[ http://pastie.org/580914][2]

我想我可以迭代结果集并附加 plist 字符串。但看起来很难看,我相信有一种更优雅的方法可以做到这一点。

我现在对 Ruby 生疏了,所以优雅的方式对我来说并不明显。似乎我应该能够覆盖 ActiveRecord 并使撤回多个记录的结果集采用 ActiveRecord::Base to_plist 并进行另一个 to_plist 实现。在 Rails 中,这会放在 environment.rb 中,对吧?

4

3 回答 3

0

我采取了简单的方法:

private

  # pass in posts resultset from finds
  def posts_to_plist(posts)
    plist_array = []
    posts.each do |post|
      plist_array << post.attributes
    end
    plist_array.to_plist
  end

public

  # GET /posts
  # GET /posts.xml
  def index
    @posts = Post.all
    #@posts = [{:a=>"blah"}, {:b=>"blah2"}]

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => posts_to_plist(@posts) }
    end
  end
于 2009-08-12T15:58:25.280 回答
0

我发现此页面正在寻找相同的答案。我认为你有正确的方法,虽然我也是一个新手(在 Rails 上)并且不确定正确的方法。我将此添加到 application_helper.rb。似乎工作。

require 'plist'
module ApplicationHelper

  class ActiveRecord::Base
    public

    include Plist::Emit

    def to_plist 
      self.attribute_names.inject({}) do |attrs, name|
        value = self.read_attribute(name)
        if !value.nil?
          attrs[name] = value
        end
        attrs
      end
    end
  end

end
于 2010-01-05T18:09:21.260 回答
0

根据 plist 项目自述文件,您应该实现“to_plist_node”,而不是“to_plist”。

您还应该将 Plist::Emit 混入您的 ActiveRecord 类。

于 2011-08-10T15:14:01.817 回答