Domanda

Sto cercando di ottenere un elenco di risultati record attivi da visualizzare come un plist per essere consumato dal iphone. Sto usando la gemma plist v 3.0.

Il mio modello è chiamato Post. E voglio POST.All (o qualsiasi array o messaggi) per visualizzare correttamente come Plist.

L'ho lavorare bene per un caso del messaggio: [ http://pastie.org/580902][1]

che è corretto, quello che mi aspetterei. Per ottenere che il comportamento che dovevo fare questo:

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

Tuttavia, quando faccio una POST.All, non posso convincerlo per visualizzare quello che voglio. Ecco cosa accade: http://pastie.org/580909

vengo smistamento. Voglio uscita più simile a questo: [ http://pastie.org/580914][2]

Suppongo che ho potuto solo scorrere il set di risultati e aggiungere le stringhe plist. Ma sembra brutto, sono sicuro che ci sia un modo più elegante per fare questo.

Sono arrugginito su Ruby in questo momento, quindi il modo elegante non è ovvio per me. Sembra come dovrei essere in grado di ignorare ActiveRecord e fare risultato-set che tirano indietro più di un record prendono il to_plist ActiveRecord :: Base e fare un altro implementazione to_plist. In rotaie, questo sarebbe andato a environment.rb, giusto?

È stato utile?

Soluzione

Ho preso la via più 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

Altri suggerimenti

Ho trovato questo sito cercando la stessa risposta. Penso che tu abbia il giusto approccio, anche se sono anche un novizio (on Rails) e non certo il modo giusto per farlo. Ho aggiunto questo per application_helper.rb. Sembra funzionare.

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

Secondo il progetto di README plist, è necessario implementare "to_plist_node", al contrario di "to_plist".

Si dovrebbe anche mixin Plist :: Emit alla classe ActiveRecord.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top