2009-08-12 36 views
3

我試圖獲取活動記錄結果的列表以顯示爲供iPhone使用的plist。我正在使用plist gem v 3.0。獲取活動記錄以顯示爲plist

我的模型被稱爲Post。我希望Post.all(或任何數組或帖子)能夠正確顯示爲Plist。

我有它工作正常的一個帖子例如: [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中進行,對吧?

回答

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 
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 
0

根據plist項目自述文件,您應該實現「to_plist_node」,而不是「to_plist」。

您還應該將Plist :: Emit混入到您的ActiveRecord類中。