obtenir des dossiers actifs pour afficher comme plist
-
13-09-2019 - |
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?
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.