2010-08-12 12 views
3

Je code suivant:Comment étendre DataMapper :: ressources avec méthode personnalisée

module DataMapper 
    module Resource 

    @@page_size = 25 

    attr_accessor :current_page 
    attr_accessor :next_page 
    attr_accessor :prev_page 

    def first_page? 
    @prev_page 
    end 

    def last_page? 
    @next_page  
end 

    def self.paginate(page) 
    if(page && page.to_i > 0) 
     @current_page = page.to_i - 1 
    else 
     @current_page = 0 
    end 

    entites = self.all(:offset => @current_page * @@page_size, :limit => @@page_size + 1) 

    if @current_page > 0 
     @prev_page = @current_page 
    end 

    if entites.size == @@page_size + 1 
     entites.pop 
     @next_page = (@current_page || 1) + 2 
    end 

    entites 
    end 
end 

fin

Ensuite, je dois appel #paginate:

@photos = Photo.paginate(params[:page]) 

Et obtenir l'erreur suivante:

application error 
NoMethodError at /dashboard/photos/ 
undefined method `paginate' for Photo:Class 

Dans Enregistrement actif Ce concept fonctionne bien pour moi ... J'utilise JRuby pour avis. Qu'est ce que je fais mal?

Répondre

12

Andrew,

Vous pouvez penser DataMapper :: ressources comme l'instance (une ligne) et de DataMapper :: Modèle de la classe (une table). Maintenant, pour modifier les capacités par défaut au niveau de la ressource ou du modèle, vous pouvez ajouter des inclusions ou des extensions à votre modèle.

D'abord, vous devrez envelopper votre méthode #paginate dans un module. J'ai également ajouté une méthode #page probablement inutile pour montrer comment ajouter à une ressource au cas où vous en auriez besoin.

module Pagination 
    module ClassMethods 
    def paginate(page) 
     # ... 
    end 
    end 
    module InstanceMethods 
    def page 
     # ... 
    end 
    end 
end 

Dans votre cas, vous voulez #paginate soit disponible sur le modèle, alors vous feriez:

DataMapper::Model.append_extensions(Pagination::ClassMethods) 

Si vous vous trouvez dans le besoin d'ajouter des capacités par défaut à toutes les ressources, faire:

DataMapper::Model.append_inclusions(Pagination::InstanceMethods) 

Espérons que ça aide!