Question

Je suis en train d'obtenir une liste de résultats records actifs pour afficher en tant que plist pour être consommé par l'iPhone. J'utilise la pierre précieuse plist v 3.0.

Mon modèle est appelé Post. Et je veux Post.all (ou tout tableau ou messages) pour afficher correctement comme Plist.

Je l'ai fonctionne bien pour une instance de post: [ http://pastie.org/580902][1]

qui est exact, ce que j'attendais. Pour obtenir ce comportement que je devais faire ceci:

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

Cependant, quand je fais un Post.all, je ne peux pas le faire pour afficher ce que je veux. Voici ce qui se passe: http://pastie.org/580909

Je me triage. Je veux une sortie plus comme ceci: [ http://pastie.org/580914][2]

Je suppose que je pourrais juste itérer le jeu de résultats et d'ajouter les chaînes plist. Mais semble laid, je suis sûr qu'il ya une façon plus élégante de le faire.

Je suis rouillé sur Ruby en ce moment, donc la façon élégante n'est pas évident pour moi. On dirait que je devrais être capable de passer outre ActiveRecord et faire result-ensembles qui tirent à plus d'un enregistrement prennent le to_plist ActiveRecord :: Base et faire une autre mise en œuvre de to_plist. Dans rails, cela irait dans environment.rb, droit?

Était-ce utile?

La solution

Je pris la voie facile:

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

Autres conseils

J'ai trouvé cette page la recherche de la même réponse. Je pense que vous avez la bonne approche, mais je suis aussi un débutant (on Rails) et pas sûr de la bonne façon de le faire. J'ajouté à application_helper.rb. Semble travailler.

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

Selon le projet plist README, vous devez mettre en œuvre "to_plist_node", par opposition à "to_plist".

Vous devez également mixin Plist :: Emet à votre classe ActiveRecord.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top