Will paginate, veramente facile ma

Buongiorno di nuovo,
la mia incapacità evidentemente non ha limiti; ho installato questo
promettente plugin, che probabilmente molti di voi usano…vi riporto la
sequenza di azioni fatte e il mio problema:
nel controller (artists_controller.rb):

def index
page = params[:page] || 1
@artists = Artist.paginate :all, :page => params[:page], :order =>
‘nome DESC’, :per_page => 2

:per_page =>2 perchè per ora avendone inseriti solo 3 non vedrei la

paginazione
end

nella index:

<% for artist in @artists -%>

  <div id="fotoArtist">
    <a href="artists/<%= artist.id%>"> <%= image_tag

artist.foto_url, :class => ‘list-image’%>

  <div class="list-description">
    <p><%=h artist.nome %></p>
    <%=h truncate(artist.storia.gsub(/<.*?>/,''),
             :length => 250) %><br />
<span id="titolino"><%= link_to 'Leggi tutto', artist %></span>
  </div>
<p><b>Sito: </b><a href="http://<%=h artist.sito_url %>"

target=“_blank”><%=h artist.sito_url %>


    <%= link_to 'Edit', edit_artist_path(artist) %> / <%= link_to

‘Destroy’, artist,
:confirm => ‘Sei Sicuro?’,
:method => :delete %>



<% end -%>

<%= will_paginate @artists %>

Ecco il problema: non funziona!
Nel senso, il <%= will_paginate @artists %> fa effettivamente vedere
questo:
« Previous 1 2 Next »
(il che mi fa presupporre che funzioni, siccome essendo 3 gli artisti e
2 il valore dato a :per_page giustamente ci saranno i primi 2 nella pria
pagina e il 3° nella seconda)
però mi fa vedere subito tutti e tre gli artisti inseriti, come nella
index di prima che usava il metodo find!
Cosa sbaglio? Ipotesi: quel for artist in @artists…però anche nel
tutorial trovato qui (GitHub - mislav/will_paginate: Pagination library for Rails and other Ruby applications) fanno in
questo modo…
Grazie in anticipo per l’aiuto…
Giò

2009/11/11 Giorgio A. [email protected]

Usa Artist.paginate senza :all.

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

On Wed, 11 Nov 2009 17:50:50 +0100
Giorgio A. [email protected] wrote:

def index
page = params[:page] || 1
@artists = Artist.paginate :all, :page => params[:page], :order =>

     ^^^^

@artists = Artist.paginate(:per_page => 10, :page => params[:page])

ecc…ecc…

ciao,
a.

che pirla
ecco cosa succede a fare copia e incolla senza ragionare…grazie
:stuck_out_tongue:
Giò

Alberto F. wrote:

On Wed, 11 Nov 2009 17:50:50 +0100
Giorgio A. [email protected] wrote:

def index
page = params[:page] || 1
@artists = Artist.paginate :all, :page => params[:page], :order =>

     ^^^^

@artists = Artist.paginate(:per_page => 10, :page => params[:page])

ecc…ecc…

ciao,
a.

e non funziona neanche :order =>
…forse c’è qualcosa di sbagliato proprio nella view…

ehm, sorry. ho provato, ma non funziona lo stesso…che fare?

ok, ho capito perchè non funziona…il fatto è che cercavo di integrare
la index che usa un named_scope per filtrare i risultati in base al tipo
di artista…

in artist.rb:

#filtraggio delle tabelle per arte
named_scope :per_arte, lambda { |arte| arte.blank? ? {} :
{:conditions => {:arte => arte}}
}

#ordinamento per il metodo find
def self.find(*args)
order_arg = args.collect do |arg|
if arg.kind_of? Hash
if arg.keys[0] == :order
arg
end

        end

      end

      if order_arg.compact.empty?
        args << {:order=>"nome"}
      end

     super

end

in artists_controller.rb:

def index
@artists = Artist.per_arte params[:arte]
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @artists }
end
end

e nella index.html.erb, dopo il for che mostra tutti gli artisti
inseriti, c’è:

Mostra: <%= link_to "tutti", {:arte => nil} %> / <%= link_to "produttori", {:arte => "producer"} %> / <%= link_to "cantanti", {:arte => "singer"} %> / <%= link_to "band o crew", {:arte => "crew"} %> / <%= link_to "mc", {:arte => "mc"} %> / <%= link_to "dj", {:arte => "dj"} %> / <%= link_to "breaker", {:arte => "breaker"} %>

Come faccio a mantenere questa funzione, e integrare la paginazione per
ogni index che viene caricata? voglio dire, mettendo che io voglia
vedere 5 artisti per pagina, li voglio vedere anche se seleziono solo i
cantanti, o solo i dj…c’è un modo o questa tecnica non è compatibile
con il plugin willpaginate?
Grazie ancora…
Giò

2009/11/11 Giorgio A. [email protected]

@artists = Artist.per_arte.paginate(:per_page => 2, :page =>
params[:page],

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

…avevo già provato, ma nel mio metodo index c’è già quel params[:arte]
che non so dove infilare se metto .paginate con gli attributi tra
parentesi…scusate l’ignoranza…

Antonio C. wrote:

2009/11/11 Giorgio A. [email protected]

@artists = Artist.per_arte.paginate(:per_page => 2, :page =>
params[:page],

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

2009/11/11 Giorgio A. [email protected]

…avevo già provato, ma nel mio metodo index c’è già quel params[:arte]
che non so dove infilare se metto .paginate con gli attributi tra
parentesi…scusate l’ignoranza…

I named scope sono dei metodi che puoi concatenare in maniera
solitamente
trasparente. Per cui nel tuo caso, potresti provare una cosa del tipo:

@artists = Artist.per_arte(params[:arte]).paginate(:per_page => 2, :page
=>
params[:page])

Sinceramente non ho letto tutti i dettagli che hai postato, quindi non
so se
il tuo problema era questo o meno, però puoi sicuramente concatenare i due
metodi come indicato qui sopra.

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

ok, ora non mi da più errore quindi sicuramente la sintassi è
giusta…peccato però che la paginazione non venga fatta :cry:
solita cosa, mi mostra questo nella pagina
« Previous 1 2 Next »
ma allo stesso tempo mostra ogni volta tutti gli artisti, invece di
prenderne 2 per volta…c’è da dire che almeno la selezione in base al
tipo di artista funziona…ma la paginazione non ne vuol sapere…qualcuno
ne sa qualcosa?
grazie infinite!!!
Giò

Antonio C. wrote:

2009/11/11 Giorgio A. [email protected]

…avevo gi� provato, ma nel mio metodo index c’� gi� quel params[:arte]
che non so dove infilare se metto .paginate con gli attributi tra
parentesi…scusate l’ignoranza…

I named scope sono dei metodi che puoi concatenare in maniera
solitamente
trasparente. Per cui nel tuo caso, potresti provare una cosa del tipo:

@artists = Artist.per_arte(params[:arte]).paginate(:per_page => 2, :page
=>
params[:page])

Sinceramente non ho letto tutti i dettagli che hai postato, quindi non
so se
il tuo problema era questo o meno, per� puoi sicuramente concatenare i due
metodi come indicato qui sopra.

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

2009/11/11 Giorgio A. [email protected]

ok, ora non mi da più errore quindi sicuramente la sintassi è
giusta…peccato però che la paginazione non venga fatta :cry:
solita cosa, mi mostra questo nella pagina
« Previous 1 2 Next »
ma allo stesso tempo mostra ogni volta tutti gli artisti, invece di
prenderne 2 per volta…c’è da dire che almeno la selezione in base al
tipo di artista funziona…ma la paginazione non ne vuol sapere…qualcuno
ne sa qualcosa?

Giorgio, fai una prova dalla console o col debugger, per vedere cosa
contiene @artists.

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

se scrivo così
@artists = Artist.per_arte.paginate(params[:arte], :per_page => 2, :page
=> params[:page])

mi da
ActiveRecord::RecordNotFound in ArtistsController#index

Couldn’t find Artist with ID=limit2ordernomeoffset0

RAILS_ROOT: …/noircrew

Giorgio A. wrote:

…avevo già provato, ma nel mio metodo index c’è già quel params[:arte]
che non so dove infilare se metto .paginate con gli attributi tra
parentesi…scusate l’ignoranza…

Antonio C. wrote:

2009/11/11 Giorgio A. [email protected]

@artists = Artist.per_arte.paginate(:per_page => 2, :page =>
params[:page],

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)

Il 12 novembre 2009 12.23, Giorgio A. [email protected] ha scritto:

Non so che pesci prendere, se non ci fosse il named_scope probabilmente
andrebbe benissimo. Però non posso rinunciarvi…
No, ti assicuro che named_scope e paginate convivono benissimo.

Noto solo ora questo:

if order_arg.compact.empty?
args << {:order=>“nome”}
end

super
end

È molto probabile che il problema sia lì; prova a eliminare quel metodo.

Se quello che vuoi è che l’ordinamento di default sia per nome, basta
scrivere:

class Artist

default_scope :order => ‘nome’
end

Maggiori info qui:

Oppure, se ordini spesso per alcuni campi, puoi fare dei named_scope:

named_scope :sorted_by_genre, :order => ‘genre’
named_scope :sorted_by_sex, :order => ‘sex’

pietro

Ho risolto ragazzi, grazie mille ancora una volta.
Colpa mia che non mi ero accorto di aver lasciato lì una ridefinizione
del metodo self.find(che trovava tutti gli artisti e li ordinava,
l’avevo fatta a scopo diciamo “didattico” e poi l’ho dimenticata lì :p),
che evidentemente viene chiamato dal metodo paginate, e che
sovrascriveva il contenuto, già corretto, di @artists con l’elenco
completo degli artisti…
leggendo ora quello che scrivi tu, pietro, noto che avevi visto anche tu
che quel metodo self.find, che avevo messo solo x provare a ordinare da
lì, mi annullava tutta la paginazione…ora funziona tutto…grazie
ancora!!
Giò

Pietro G. wrote:

Il 12 novembre 2009 12.23, Giorgio A. [email protected] ha scritto:

Non so che pesci prendere, se non ci fosse il named_scope probabilmente
andrebbe benissimo. Per� non posso rinunciarvi…
No, ti assicuro che named_scope e paginate convivono benissimo.

Noto solo ora questo:

if order_arg.compact.empty?
args << {:order=>“nome”}
end

super
end

� molto probabile che il problema sia l�; prova a eliminare quel metodo.

Se quello che vuoi � che l’ordinamento di default sia per nome, basta
scrivere:

class Artist

default_scope :order => ‘nome’
end

Maggiori info qui:
ActiveRecord::Base

Oppure, se ordini spesso per alcuni campi, puoi fare dei named_scope:

named_scope :sorted_by_genre, :order => ‘genre’
named_scope :sorted_by_sex, :order => ‘sex’

pietro

come pensavo, se lancio da console
@artists = Artist.per_arte(nil).paginate(:per_page => 2, :page => qui
posso mettere qualsiasi numero, il risultato è lo stesso
)
mi da in uscita l’array riempito con tutti gli artisti, e non solo con
quelli della prima, o della seconda pagina(essendo 4 gli artisti e
per_page => 2)…
Non so che pesci prendere, se non ci fosse il namde_scope probabilmente
andrebbe benissimo. Però non posso rinunciarvi…
Help!
Grazie ancora

Antonio C. wrote:

2009/11/11 Giorgio A. [email protected]

ok, ora non mi da pi� errore quindi sicuramente la sintassi �
giusta…peccato per� che la paginazione non venga fatta :cry:
solita cosa, mi mostra questo nella pagina
� Previous 1 2 Next �
ma allo stesso tempo mostra ogni volta tutti gli artisti, invece di
prenderne 2 per volta…c’� da dire che almeno la selezione in base al
tipo di artista funziona…ma la paginazione non ne vuol sapere…qualcuno
ne sa qualcosa?

Giorgio, fai una prova dalla console o col debugger, per vedere cosa
contiene @artists.

Ciao,
Antonio

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)