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 -%>
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ò
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’è:
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ò
…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…
…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:
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.
ok, ora non mi da più errore quindi sicuramente la sintassi è
giusta…peccato però che la paginazione non venga fatta
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ò
…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:
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.
ok, ora non mi da più errore quindi sicuramente la sintassi è
giusta…peccato però che la paginazione non venga fatta
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.
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…
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:
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ò
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:
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
ok, ora non mi da pi� errore quindi sicuramente la sintassi �
giusta…peccato per� che la paginazione non venga fatta
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.