2009-08-12 4 views
3

Ich versuche eine Liste der aktiven Ergebnisse zu erhalten, die angezeigt werden, um vom iPhone konsumiert zu werden. Ich benutze den Plist Gem v 3.0.aktive Datensätze erhalten, die als plist angezeigt werden

Mein Modell heißt Post. Und ich möchte Post.all (oder jedes Array oder Posts) korrekt als Plist anzeigen.

Ich habe es funktioniert gut für einen Beitrag Beispiel: [http://pastie.org/580902][1]

das richtig ist, was ich erwarten würde. Um dieses Verhalten zu bekommen Ich hatte dies zu tun:

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

Allerdings, wenn ich einen Post.All tun, kann ich nicht bekommen, es zu zeigen, was ich will. Hier ist, was passiert: http://pastie.org/580909

Ich bekomme Marshalling. Ich möchte Ausgabe eher so: [http://pastie.org/580914][2]

Ich nehme an, ich könnte nur die Ergebnismenge iterieren und die Plist Saiten anhängen. Aber scheint hässlich, ich bin mir sicher, dass es eine elegantere Möglichkeit gibt, dies zu tun.

Ich bin gerade auf Ruby eingerostet, also ist der elegante Weg für mich nicht offensichtlich. Scheint, dass ich in der Lage sein sollte, ActiveRecord zu überschreiben und Resultsets zu machen, die mehr als einen Datensatz zurücknehmen, nehme ActiveRecord :: Base zu_plist und führe eine andere to_plist-Implementierung durch. In Rails würde dies in environment.rb gehen, oder?

Antwort

0

nahm ich den einfachen Weg:

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

ich diese Seite gefunden für die gleiche Antwort zu suchen. Ich denke, Sie haben den richtigen Ansatz, obwohl ich auch ein Neuling bin (auf Rails) und nicht sicher bin, wie ich das richtig machen könnte. Ich habe dies zu application_helper.rb hinzugefügt. Scheint zu arbeiten.

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

Nach dem plist Projekt README, sollten Sie "to_plist_node" implementieren, wie zu "to_plist" gegenüber.

Sie sollten Plist :: Emit auch mit Ihrer ActiveRecord-Klasse mischen.