2009-09-23 10 views
3

Je suis nouveau sur Rails et j'ai de la difficulté à obtenir will_paginate pour travailler avec une ressource imbriquée.Comment utiliser will_paginate avec une ressource imbriquée dans Rails?

J'ai deux modèles, Statement et Invoice. will_paginate fonctionne sur Statement, mais je n'arrive pas à le faire fonctionner sur Invoice. Je sais que je ferais quelque chose de stupide, mais je ne peux pas le comprendre et les exemples que j'ai trouvés sur google ne fonctionneront pas pour moi.

statement.rb 
class Statement < ActiveRecord::Base 
    has_many :invoices 

    def self.search(search, page) 
    paginate :per_page => 19, :page => page, 
     :conditions => ['company like ?', "%#{search}%"], 
     :order => 'date_due DESC, company, supplier' 
    end 
end 

statements_controller.rb <irrelevant code clipped for readability> 
def index #taken from the RAILSCAST 51, will_paginate podcast 
    @statements = Statement.search(params[:search], params[:page]) 
end 

I call this in the view like so, and it works: 
    <%= will_paginate @statements %> 

Mais je ne peux pas comprendre comment le faire fonctionner pour les factures:

invoice.rb 
class Invoice < ActiveRecord::Base 
    belongs_to :statement 

    def self.search(search, page) 
    paginate :per_page => 19, :page => page, 
     :conditions => ['company like ?', "%#{search}%"], 
     :order => 'employee' 
    end 
end 

invoices_controller.rb 
class InvoicesController < ApplicationController 

    before_filter :find_statement 


    #TODO I can't get will_paginate to work w a nested resource 
    def index #taken from the RAILSCAST 51, will_paginate podcast 
     @invoices = Invoice.search(params[:search], params[:page]) 
    end 

def find_statement 
    @statement_id = params[:statement_id] 
    return(redirect_to(statements_url)) unless @statement_id 
    @statement = Statement.find(@statement_id) 
    end 
end 

Et j'essayer de l'appeler comme ceci: <% = will_paginate (@invoices)%> Le message d'erreur le plus courant, tel que je le lis, est: "La variable @statements semble être vide Avez-vous oublié de passer l'objet de collection pour will_paginate?"

Je ne sais pas quel est le problème, ou comment le réparer. Merci pour toute aide et conseil!

Répondre

5

Résolu -

je me suis déplacé les factures Pagination dans le contrôleur de déclaration, comme ceci:

def show 
    @statement = Statement.find(params[:id]) 

    #TODO move the :per_page stuff out to a constant 
    @invoices = @statement.invoices.paginate :per_page => 10, 
    :page => params[:page], 
    :order => 'created_at DESC' 


respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @statement } 
end 
end 

et l'appeler dans la vue comme celui-ci (le code garni pour une meilleure lisibilité>

<div id="pagination"> 
    <%= will_paginate @invoices %> 
    </div> 
    <table> 
    <%# @statement.invoices.each do |invoice| - 
    shows all invoices with no pagination, 
    use @invoices instead%> 
    <% 
    @invoices.each do |invoice| 
    %>