[rails] will_paginate - metodi e proprietà ?

Salve! Sto dando un’occhiata al plug-in will_paginate. Facile, funziona
tutto. Ho visto come si pagina e anche i vari metodi paginate_by_+, solo
che volevo capirci di più: esattamente, dalla view, che metodi e che
varialbili ho a disposizione oltre a quelli di base?
Tipo, se voglio farmi sputare la current_page o pages_count, che sono
proprietà del plugin (ho spulciato anche tutto il codice e visto i docs
online), come faccio dalla view?
Se ad esempio voglio vedere @total_pages, è possibile? E devo per forza
passare dal controller?
E il mio ipotetico @posts (= Post.paginate blabla), oltre ai find
mascherati da paginate, eredita qualcos’altro di tutte le proprietà dei
vari oggetti di paginazione standard di Rails?

Preciso che comunque sono un principiante…

Anyone? :wink:

Comincio a rispondermi da solo, ma ogni aggiunta e aiuto è assolutamente
gradita.

Intanto il mio @posts, che in soldoni è un’istanza di
WillPaginate::Collection, sia nel controller sia nella view è rifornito
dei seguenti metodi:

page_count > ritorna @total_pages

offset > titorna il numero di entries pari alla prima-1 della pagina
corrente. In altre parole, se ce ne sono 30 per pagina, la prima della
pagina 2 è la numero 31 e dunque l’offset == 30.

previous_page > ritorna, se c’è, @current_page-1

next_page > ritorna, se c’è, @current_page+1


Lo stesso oggetto è rifornito delle seg. proprietà :

  • current_page
  • per_page
  • total_entries

Per ora è tutto. Attendo aiuti/suggerimenti! :slight_smile:

Luca R. wrote:

Salve! Sto dando un’occhiata al plug-in will_paginate. Facile, funziona
tutto. Ho visto come si pagina e anche i vari metodi paginate_by_+, solo
che volevo capirci di più: esattamente, dalla view, che metodi e che
varialbili ho a disposizione oltre a quelli di base?
Tipo, se voglio farmi sputare la current_page o pages_count, che sono
proprietà del plugin (ho spulciato anche tutto il codice e visto i docs
online), come faccio dalla view?
Se ad esempio voglio vedere @total_pages, è possibile? E devo per forza
passare dal controller?
E il mio ipotetico @posts (= Post.paginate blabla), oltre ai find
mascherati da paginate, eredita qualcos’altro di tutte le proprietà dei
vari oggetti di paginazione standard di Rails?

Preciso che comunque sono un principiante…

Anyone? :wink:

Luca R. wrote:

Salve! Sto dando un’occhiata al plug-in will_paginate. Facile, funziona
tutto. Ho visto come si pagina e anche i vari metodi paginate_by_+, solo
che volevo capirci di più: esattamente, dalla view, che metodi e che
varialbili ho a disposizione oltre a quelli di base?

domanda magari stupida (il plugin in questione non l’ho mai usato)

quali vantaggi da l’uso di questo plugin rispetto al paginate di default
di
rails?? dai metodi che hai descritto non mi sembra ci sia niente in
più…


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

Beh, il metodo di default non lo conosco molto bene. Sono partito quasi
subito col plugin perché paginate (sembra già ufficiale, è scritto anche
nei docs:
Peak Obsession)
verrà tolto e spostato appunto in un plug-in nella versione 2.0 di
rails.
Essendo che sto imparando rails, mi adeguo già ed evito di perder tempo.
Solo che di questo plugin la documentazione non è molto prolissa, e
presuppone che a leggerla non sia un principiante.

Non è l’unico comunque, ce n’è almeno un altro:

http://paginator.rubyforge.org/

e anche questo:

Ciao!

tarini wrote:

Luca R. wrote:

Salve! Sto dando un’occhiata al plug-in will_paginate. Facile, funziona
tutto. Ho visto come si pagina e anche i vari metodi paginate_by_+, solo
che volevo capirci di pi�: esattamente, dalla view, che metodi e che
varialbili ho a disposizione oltre a quelli di base?

domanda magari stupida (il plugin in questione non l’ho mai usato)

quali vantaggi da l’uso di questo plugin rispetto al paginate di default
di
rails?? dai metodi che hai descritto non mi sembra ci sia niente in
pi�…


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

Dimenticavo: WillPaginate, il link:
http://plugins.require.errtheblog.com/browser/will_paginate

tarini ha scritto:

quali vantaggi da l’uso di questo plugin rispetto al paginate di default di
rails?? dai metodi che hai descritto non mi sembra ci sia niente in più…

Il paginate di default è deprecato e non più contenuto nella imminente
versione 2.0.
Per maggiori dettagli:

http://dev.rubyonrails.org/ticket/8157
http://dev.rubyonrails.org/changeset/6992
http://dev.rubyonrails.org/changeset/6993


blog: www.lucaguidi.com

Bringing Rails to Italy
First italian Ruby On Rails conference:
Oct, 26-27 2007 - Pisa
www.railstoitaly.org

Altra piccola scoperta: paginate non è altro che un find un po’ furbo, e
di conseguenza mantiene anche un po’ delle sue caratteristiche:

Modo standard:
@entries = Entry.paginate :page => params[:page], :per_page => 10

Supporta le opzioni di find, come :order
@entries = Entry.paginate :page => params[:page], :per_page => 10,
:order => “title DESC”

supporta i finders dinamici:
@entries = Entry.paginate_by_title ‘titolo 2’, :page => params[:page],
:per_page => 10

Nota: copio incollo dal mio codice. @entries sono quelli che prima
chiamavo genericamente @posts.

Per ora è tutto.

Comincio a rispondermi da solo, ma ogni aggiunta e aiuto è assolutamente
gradita.

Intanto il mio @posts, che in soldoni è un’istanza di
WillPaginate::Collection, sia nel controller sia nella view è rifornito
dei seguenti metodi:

page_count > ritorna @total_pages

offset > titorna il numero di entries pari alla prima-1 della pagina
corrente. In altre parole, se ce ne sono 30 per pagina, la prima della
pagina 2 è la numero 31 e dunque l’offset == 30.

previous_page > ritorna, se c’è, @current_page-1

next_page > ritorna, se c’è, @current_page+1


Lo stesso oggetto è rifornito delle seg. proprietà :

  • current_page
  • per_page
  • total_entries

Per ora è tutto. Attendo aiuti/suggerimenti! :slight_smile:

Scusa la domanda, magari è stupida, ma perché stai facendo un join?
Non basta un has_many/has_one con relativo belongs_to nel modello?

Il giorno 29/nov/07, alle ore 10:07, Cosimo G. ha scritto:

Supporta le opzioni di find, come :order
@entries = Entry.paginate :page => params[:page], :per_page => 10,
:order => “title DESC”

Ciao,
leggevo i tuoi commenti perché nell’usare il plugin non riesco ad
utilizzare una di queste opzioni.
Il problema sussiste quando aggiungo l’opzione :joins al paginate che ho
inserito nel model( sto usando Rails ).

Ecco il codice:
paginate :page => page,
:conditions => condition, :per_page => 10,
:joins => "inner join Fornitore on Fornitore.CodiceFornitore =
ListinoProdotto.CodiceFornitore ",
:order => sort

senza il join ovviamente non ottengo le informazioni desiderate.
La cosa sconcertante è che l’errore restituito non mi aiuta a trovare
una soluzione:

DBI::DatabaseError in ListinoprodottoController#confezionamento

37000 (8156) [Microsoft][ODBC SQL Server Driver][SQL Server]La colonna
‘CodiceFornitore’ � stata specificata pi� volte per ‘tally’.

RAILS_ROOT: ./script/…/config/…
Application Trace | Framework Trace | Full Trace

e:/ruby/lib/ruby/site_ruby/1.8/DBD/ODBC/ODBC.rb:168:in execute' e:/ruby/lib/ruby/site_ruby/1.8/dbi/dbi.rb:640:inexecute’
e:/ruby/lib/ruby/site_ruby/1.8/dbi/dbi.rb:671:in select_all' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/sqlserver_adapter.rb:366:inadd_limit_offset!’
e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1139:in
add_limit!' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1101:inconstruct_finder_sql’
e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:997:in
find_every' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:418:infind’
#{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:106:in
send' #{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:106:inmethod_missing’
#{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/collection.rb:52:in
create' #{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:104:inmethod_missing’
#{RAILS_ROOT}/app/models/listinoprodotto.rb:10:in
display_product_quantity' #{RAILS_ROOT}/app/controllers/listinoprodotto_controller.rb:49:inconfezionamento’
-e:4:in `load’
-e:4

Viene presentato come un errore del Database ma se eseguita in console
la query funziona.

Vorrei anche riportare il bug ma prima devo capire dove nasce il
problema.
Spero mi lasciate il vostro aiuto.
Grazie.

Giovanni I. wrote:

Scusa la domanda, magari � stupida, ma perch� stai facendo un join?
Non basta un has_many/has_one con relativo belongs_to nel modello?

Il giorno 29/nov/07, alle ore 10:07, Cosimo G. ha scritto:

Ciao Giovanni,
in realtà il problema è:
come faccio ad ordinare la tabella alfabeticamente ma in base al campo
della tabella belongs_to( cui appartiene ) ?

Model.find :all, :includes => :associated_model, :order =>
‘tabellachetiinteressa_campo ASC’

Le mail ti raggiungono ovunque con BlackBerry® from Vodafone!

Grazie Giovanni,
funziona anche con will_paginate :-)))

Ciao Cosimo,

purtroppo io sono ancora un principiante in termini di db, vengo da 10
anni di client-side e mi sto affacciano solo ora al lato server, quindi
quando mi parli di join, so cosa vuoi dire ma non ho idea dei motivi del
baco…

Se posso darti un consiglio però, se te la cavi un po’ con l’inglese,
dopo pranzo quando di là si svegliano, fai un giro nel forum ufficiale
di rails.
Senza nulla togliere al nostro, di la normalmente sono di + e c’è +
gente che ti risponde e di solito in fretta.

http://www.ruby-forum.com/forum/3

Hola! :slight_smile:

Cosimo G. wrote:

Supporta le opzioni di find, come :order
@entries = Entry.paginate :page => params[:page], :per_page => 10,
:order => “title DESC”

Ciao,
leggevo i tuoi commenti perché nell’usare il plugin non riesco ad
utilizzare una di queste opzioni.
Il problema sussiste quando aggiungo l’opzione :joins al paginate che ho
inserito nel model( sto usando Rails ).

Ecco il codice:
paginate :page => page,
:conditions => condition, :per_page => 10,
:joins => "inner join Fornitore on Fornitore.CodiceFornitore =
ListinoProdotto.CodiceFornitore ",
:order => sort

senza il join ovviamente non ottengo le informazioni desiderate.
La cosa sconcertante è che l’errore restituito non mi aiuta a trovare
una soluzione:

DBI::DatabaseError in ListinoprodottoController#confezionamento

37000 (8156) [Microsoft][ODBC SQL Server Driver][SQL Server]La colonna
‘CodiceFornitore’ � stata specificata pi� volte per ‘tally’.

RAILS_ROOT: ./script/…/config/…
Application Trace | Framework Trace | Full Trace

e:/ruby/lib/ruby/site_ruby/1.8/DBD/ODBC/ODBC.rb:168:in execute' e:/ruby/lib/ruby/site_ruby/1.8/dbi/dbi.rb:640:in execute’
e:/ruby/lib/ruby/site_ruby/1.8/dbi/dbi.rb:671:in select_all' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/sqlserver_adapter.rb:366:in add_limit_offset!’
e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1139:in
add_limit!' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1101:in construct_finder_sql’
e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:997:in
find_every' e:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:418:in find’
#{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:106:in
send' #{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:106:in method_missing’
#{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/collection.rb:52:in
create' #{RAILS_ROOT}/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:104:in method_missing’
#{RAILS_ROOT}/app/models/listinoprodotto.rb:10:in
display_product_quantity' #{RAILS_ROOT}/app/controllers/listinoprodotto_controller.rb:49:in confezionamento’
-e:4:in `load’
-e:4

Viene presentato come un errore del Database ma se eseguita in console
la query funziona.

Vorrei anche riportare il bug ma prima devo capire dove nasce il
problema.
Spero mi lasciate il vostro aiuto.
Grazie.

Riesumo la discussione per chiedervi che plugin usate voi per fare la
paginazione, quelli che mi piacciono di più sono questi due:

http://mislav.caboo.se/rails/will_paginate-love/

di cardboardrocket.com mi piace il fatto che utilizza il classico find e
gli passa i parametri per fare la paginazione es.

@cogs = Cog.find(:all,

:page => {:size => 10,

:current => params[:page]})

will_paginate sembra abbia più fans e fornisce funzionalità aggiuntive
come il named_scope

Non saprei su cosa puntare, mi piacerebbe sapere la vostra opinione.

Np, basta chiedere :slight_smile:

Il giorno 04/dic/07, alle ore 16:27, Cosimo G. ha scritto:

Devo precisare che li vorrei usare con richieste ajax, will_paginate è
molto comodo perchè crea in automatico nella vista anche la gestione
della paginazione ma purtroppo non è in ajax, anche se lo fosse credo
sarebbe difficile gestire casi specifici o mi sbaglio?
Esempio un form con un button il cui click riempie una div. Ora dovrei
fare che il link della paginazione effettuasse altre chiamate ajax con i
parametri del form. Lo farei semplicemente agganciando il tag a con
prototype e passando il numero della pagina come parametro.
La domanda è sempre la stessa, qualcuno ha già fatto qualcosa del
genere?

On Mon, Apr 21, 2008 at 2:26 PM, Luca G. [email protected]
wrote:

Event.addBehavior.reassignAfterAjax = true;
Event.addBehavior({
‘div.pagination a’ : Remote.Link
});

Io di solito faccio una cosa del genere anche con prototype riassegnando
l’observer dopo la chiamata ajax.Avevo messo qui un esempio:

http://gravityblast.com/2008/03/25/will_paginate-with-ajax-and-unobtrusive-javascript/

Ciao Marco,
Io ho risolto il problema in questo modo:

app/controllers/sources_controller.rb:
class SourcesController < ApplicationController
def index
@sources = Source.paginate :page => params[:page], :per_page => 10

 respond_to do |format|
   format.html # index.html.erb
   format.js do
     render :update do |page|
       page.replace_html 'sources', :partial => 'sources'
     end
   end
 end

end
end

app/views/sources/index.html.erb:

Sources

<%= render :partial => 'sources' %>

app/views/sources/_sources.html.erb:

<%= will_paginate @sources %>

Poi, scarica LowPro, copialo in public/javascripts ed includilo nel tag
head.
Crea un file sources.js e scrivi:

Event.addBehavior.reassignAfterAjax = true;
Event.addBehavior({
‘div.pagination a’ : Remote.Link
});

Fatto! In questo modo se javascript è attivo, i link contenuti nel div
con class pagination, verranno trasformati in Remote.Link, ovvero il
loro ‘onclick’ effettuerà chiamate AJAX. Se javascript è disabilitato,
LowPro non riuscirà in questa operazione, quindi i link si comporteranno
in modo classico, passando il numero di pagina come parametro della get
request.
ES: /sources?p=1

Luca

Si, è equivalente, solo che nel mio caso è LowPro a fare il lavoro sporco.

Grazie Luca e grazie anche ad Andrea.
Uso già Lowpro ma quello che dici l’ho capito solo in parte, l’avevo
letto anche quà :
http://railsontherun.com/2007/9/27/ajax-pagination-in-less-than-5-minutes

nel frattempo che lavoravo ho risolto con un sistema ibribo ma mi
piacerebbe capire quello che mi hai descritto.

Nel controller ho:

@pippo = Pippo.paginate(:all, :page=>(params[:page]||1),
:conditions=>[“datains >= ? and datains <=
?”,params[:ricerca][:data_da],params[:ricerca][:data_a] ] )

questo è il javascript che acchiappa i tag “a”, nel layout:

Event.addBehavior.reassignAfterAjax = true;
Event.addBehavior({
<%= yield :extend_behavior_js %>
});

e nella view:

<% content_for :extend_behavior_js do -%>
//-- pagination
‘div.pagination a:click’ : function(e) {
var div_dest = ‘inq_result’
new Ajax.Updater(
div_dest,
this.href,
{
asynchronous:true,
evalScripts:true,
onLoading:function(){
$(div_dest).innerHTML=‘’;
},
parameters:Form.serialize($(‘frm_inquiry’)) + ‘&authenticity_token=’ +
encodeURIComponent(‘217195cdb07d8deabe70098cf5189c20613a0fe5’)
}
);
return false;
}
<% end -%>

Tralasciando il sistema per personalizzare la Event.addBehavior, questo
è il mio sistema “ibrido” e devo dire che funziona

Quello che non ho capito è questo codice:
respond_to do |format|
format.html # index.html.erb
format.js do
render :update do |page|
page.replace_html ‘sources’, :partial => ‘sources’
end
end
end

e neanche questo:
‘div.pagination a’ : Remote.Link

Remote.Link lo devo sostituire col mio href?