2010-11-24 32 views
0

Je tente de mettre un contacts partielle paginée à l'intérieur d'une vue pour rooftops. Rooftops a de nombreux contacts et a également un itinéraire imbriqué permettant /rooftops/1/contacts. Lorsque j'essaie de créer les liens will_paginate, j'obtiens le chemin /rooftops/1 plutôt que '/ rooftops/1/contacts /'.rails pagination itinéraires imbriqués

Existe-t-il un moyen de modifier le chemin de pagination sans créer ma propre vue de lien de pagination? J'ai essayé d'aller à la rdoc pour will_paginate here mais il va à une page godaddy.

Des idées?

class Contact < ActiveRecord::Base 
    has_and_belongs_to_many :parents 
    has_and_belongs_to_many :rooftops 
    has_one :user 
    has_one :address, :as => :addressable, :dependent => :destroy 
    has_many :phone, :as => :phoneable, :dependent => :destroy 
    belongs_to :position 
    accepts_nested_attributes_for :address, :reject_if => lambda { |a| a[:street].blank? } 
    accepts_nested_attributes_for :phone, :reject_if => lambda { |a| a[:phone_number].blank? }, :allow_destroy => true 

    validates_associated :address, :phone, :position 
    validates_presence_of :lname 
    validates_presence_of :fname 
    validates_presence_of :email 
    validates_presence_of :position_id 

    def self.search(page) 
    paginate :per_page => 3, 
       :page => page 
    end 
end 

class RooftopsController < ApplicationController 
    def show 
    @rooftop = Rooftop.find(params[:id]) 
    @contacts = @rooftop.contacts.search(1) 
    end 
end 

<div class='pagination'> 
    <%= will_paginate contacts %> 
</div> 

Cela crée /rooftops/1 et je ne suis pas sûr de savoir comment forcer à /rooftops/1/contacts.

--------------------- EDIT ---------------------

Mes routes est

resources :rooftops do 
    resources :contacts 
end 

Je pense savoir où est mon problème. Depuis ma fonction de recherche est dans le modèle. Je ne touche jamais le contrôleur contacts. Je fais la recherche à partir du contrôleur rooftops et appelle un partiel de la vue contacts. Je vais montrer ce que sont mes opinions.

<div id='contacts' style='margin-top: 20px; border-bottom: 1px solid lightgrey;'> 
    <h4>Contacts <%= link_to "new", new_polymorphic_path([@rooftop, Contact]) %></h4> 

<%= render :partial => 'contacts/contacts', :locals => { :object_type => @rooftop, :layer => 1 } %> 
</div> 

Ceci est le partiel actuel. Comme vous pouvez le voir, il ne passe jamais vraiment par le contrôleur de contacts. Cela pourrait-il être la source de mon problème?

<table> 
<tr> 
    <th></th> 
</tr> 
<% @contacts.each do |contact| %> 
<tr> 
    <td class='contact_mailer'> 
    <%= link_to image_tag('icons/gray_light/mail_12x9.png'), "mailto:#{contact.email}" %> 
    </td> 
    <td> 
    <div class='expandable layer_<%= layer %>' style='float: left'> 
    <%= link_to contact.fname.titleize + ' ' + contact.lname.titleize, polymorphic_path([object_type, @contact]), :class => "contact_name" %> 
     </div> 
    </td> 
    <td> 
     <%= image_tag 'icons/blue/key_stroke_8x8.png' %> 
    </td> 
</tr> 
<% end %> 
</table> 

<br /> 
<div class='pagination'> 
    <%= will_paginate @contacts %> 
</div> 

Merci pour votre aide.

+0

la page wiki github de mislav/will_pageinate et la documentation est probablement la même, essayez-le ici: https://github.com/mislav/will_paginate/wiki – fifigyuri

Répondre

1

Il y a plusieurs endroits où vous pourriez vous tromper. Vous n'avez peut-être pas défini correctement vos itinéraires. L'appel will_paginate devrait être dans la vue des contacts, c'est là? Ce n'est pas clair à partir de l'extrait que vous avez donné.

La méthode self.search dans le modèle Contact est très curieuse pour moi, cela devrait plutôt être dans le contrôleur. Il est logique, la méthode de recherche est liée au contrôle de la Contact. Et l'avoir comme une méthode d'instance.

La route rooftops/:id/contacts devrait conduire à un contrôleur de contact. Vous pourriez vérifier s'il en est ainsi.

Je suppose que vous besoin de quelque chose comme ceci:

class Contact < ActiveRecord::Base 
    # your model definition, validations 
    # no self.search method here 
    cattr_reader :per_page 
    @@per_page = 3 
end 

class RooftopsController < ApplicationController 
    # your RooftopsController methods 
    # the show you listed should be in ContactsController 
end 

class ContactsController < ApplicationController 
    def show 
    # I guess you have contacts for Rooftop 
    @contacts = Rooftop.find(params[:id]).contacts 
    # you paginate the array of results 
    @contacts.paginate(params[:page]) 
    end 

## This is in the view of the Contacts#show 
<div class='pagination'> 
    <%= will_paginate contacts %> 
</div> 

Vous avez probablement besoin de paginer sur un tableau. C'est simple à faire, s'il vous plaît se référer à this. J'espère que cela a aidé.

+0

Jetez un oeil à mon édition pour plus d'explications et de code – rrivas