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? ;)
on 30.09.2007 14:25
on 01.10.2007 18:24
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! :) Luca Reghellin 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? ;)
on 01.10.2007 19:15
> > Luca Reghellin 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
on 01.10.2007 21:02
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: http://api.rubyonrails.com/classes/ActionController/Pagination.html) 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: http://cardboardrocket.com/pages/paginating_find Ciao! tarini wrote: >> >> Luca Reghellin 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
on 01.10.2007 21:04
Dimenticavo: WillPaginate, il link: http://plugins.require.errtheblog.com/browser/will_paginate
on 01.10.2007 21:41
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
on 01.10.2007 22:21
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! :) >
on 29.11.2007 10:07
> 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.
on 29.11.2007 10:20
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 Guglielmucci ha scritto:
on 29.11.2007 10:28
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! :) Cosimo Guglielmucci 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.
on 04.12.2007 12:15
Giovanni Intini 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 Guglielmucci 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 ) ?
on 04.12.2007 12:35
Model.find :all, :includes => :associated_model, :order => 'tabellachetiinteressa_campo ASC' Le mail ti raggiungono ovunque con BlackBerry® from Vodafone!
on 04.12.2007 16:27
Grazie Giovanni, funziona anche con will_paginate :-)))
on 04.12.2007 16:38
Np, basta chiedere :) Il giorno 04/dic/07, alle ore 16:27, Cosimo Guglielmucci ha scritto:
on 21.04.2008 10:11
Riesumo la discussione per chiedervi che plugin usate voi per fare la paginazione, quelli che mi piacciono di più sono questi due: http://cardboardrocket.com/pages/paginating_find 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.
on 21.04.2008 11:34
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 21.04.2008 14:27
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:
<h1>Sources</h1>
<div id="sources">
<%= render :partial => 'sources' %>
</div>
app/views/sources/_sources.html.erb:
<!-- qui implementi la tua view -->
<%= 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
on 21.04.2008 14:39
On Mon, Apr 21, 2008 at 2:26 PM, Luca Guidi <guidi.luca@gmail.com> 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/
on 21.04.2008 14:47
Si, è equivalente, solo che nel mio caso è LowPro a fare il lavoro sporco.
on 21.04.2008 17:22
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='<img src="images/ajax_loading.gif" border="0" />'; }, 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?
on 21.04.2008 17:43
Iniziamo con Remote.Link, è un oggetto di LowPro, si fa carico di trasformare il tuo tradizionale link in uno che effettua chiamate remote asincrone (AJAX). Ovviamente utilizzar l'attributo href per sapere dove indirizzare la request. Il blocco respond_to è una feature di Rails 2.0, se sei a digiuno, ti consiglio vivamente di studiarla. Rende il tuo controller in grado di rispondere ad uno o più mime types. La prima riga di codice "cattura" le richieste sincrone (non AJAX), e si occupa di renderizzare il file index.html.erb. La seconda riga è diversa, cattura le richieste AJAX, esegue quel blocco passato come argomento e rispedisce il codice javascript che il client deve eseguire. In questo caso gli diciamo di sostituire il contenuto dell'elemento che ha come 'sources' come id, renderizzando di nuovo il partial 'sources'. Non a caso app/views/sources/index.html.erb: <h1>Sources</h1> <div id="sources"> <%= render :partial => 'sources' %> </div> Quindi, ricapitolando, se JavaScript è abilitato, LowPro trasforma i tuoi link in oggetti che effettuano chiamate AJAX, a cui risponde il secondo blocco di codice del tuo controller, che si occuperà di aggiornare il DOM della tua view. Nel caso contrario (JavaScript disabilitato) i tuoi link avranno un comportamento tradizionale (chiamate sincrone), quindi passeranno il numero di pagina come parametro della GET request. In questo caso sarà format.html ad occuparsi semplicemente di renderizzare la tua view. Spero d'essere stato chiaro. Luca
on 22.04.2008 16:52
Grazie Luca, gentilissimo anche se non mi è chiara una cosa: sources è
presente sia come partials che come vista?
Inoltre non mi funziona se volessi allegare alla richiesta asincrona i
dati di un form, viene generato un errore in prototype, come se non
trovasse il mio form ma invece esiste, l'ho testato con firebug, bo!
Event.addBehavior({
'#add_item' : Remote.Link({
onLoading: function(){
$('dynamic').update('Attendi...');
}
,onComplete:function(){
$('dynamic').hide().visualEffect('BlindDown');
}
,parameters:Form.serialize($('frm_test'))
})
});
se lascio solamente la onLoading e la onComplete invece funziona, non è
che con Remote.Link non è previsto altro che non siano gli stati della
richiesta??
on 22.04.2008 17:14
No, sources è presente solo come partial.
Remote.Link è un oggetto di LowPro che wrappa Ajax.Request (Prototype),
accetta due parametri, il primo è un element, il secondo un hash di
options.
Prova
così:Event.addBehavior({
'div.pagination a:click' : function(e) {
new Remote.Link(event.element(), {
onLoading: {
// blablabla
}
});
}
});
Non ho testato sto codice, quindi se non funziona, ti consiglio di
studiare il codice di Remote (lowpro.js:255)
Luca
on 30.04.2008 09:46
Grazie Luca, in effetti non funziona ma lo sto utilizzando come spunto.
Tornando al codice per veicolare le richieste ajax:
format.js do
render :update do |page|
page.replace_html 'sources', :partial => 'sources'
end
end
se volessi elaborare diversi partial, a seconda di un parametro, io ho
fatto così:
format.js do
render :update do |page|
case operazione
when nil
page.replace_html 'new1', :partial => 'new1'
when '2'
page.replace_html 'new2', :partial => 'new2'
else
page.replace_html 'new'+operazione, :partial =>
'new'+operazione
end
end
end
però non funziona come vorrei, utilizza sempre il partial _new1 anche se
la variabile operazione è valorizzata correttamente, cosa sbaglio??
on 05.05.2008 09:50
Ciao Marco, Quello che ti posso consigliare, lo riassumo in una parola: debug. Vedi se realmente la variabile operazione è correttamente valorizzata e prova ad esplicitare 'return' alla fine di ogni caso dello switch. Come mai hai bisogno di questa implementazione? Sicuro che non c'è qualcosa di più lineare? Luca -- blog: www.lucaguidi.com Pro-Netics: www.pro-netics.com Sourcesense - making sense of Open Source: www.sourcesense.com
on 06.05.2008 14:47
Ciao Luca, ho risolto col debug. Andava bene quel codice, l'errore era
che non includevo lowpro ed i link non erano ajax, una banalità .
Alla fine ho eliminato il case ed utilizzo solo un istruzione:
format.js do
render :update do |page|
page.replace_html 'new'+@step, :partial => 'new'+@step
end
end
non so se sia il metodo migliore: devo aggiornare delle div in base alla
variabile @step. La creazione (new dello scaffold) la faccio fare con
delle scelte in 3 passi ed i tre partial si richiamano a cascata. Usando
il sistema usato per la paginazione riesco ad avere javascript
unobstrusive, lo scopo era questo.
-> new.html.erb -> div new1
(prima scelta che mi aggiorna la div new1 evidenziando cosa ho scelto ed
in base a questo riempie la div new2)
-> new.html.erb -> div new1 -> div new2
(seconda scelta che mi aggiorna la div new2 e mi riempie la div new3)
-> new.html.erb -> div new1 -> div new2 -> div new3
(mostra il form specifico e crea il record il base alle scelte
precedenti)
-> fine
Funziona anche senza ajax perchè controllando la variabile @step
all'interno delle viste includo o meno i partial a cascata.
Se c'è un metodo migliore ben venga!