Hi there,
Is there a neat and easy way to implement pagination with letters
rather than numbers eg :
A B C D … Z
Rob
Hi there,
Is there a neat and easy way to implement pagination with letters
rather than numbers eg :
A B C D … Z
Rob
Robert Z. wrote:
Hi there,
Is there a neat and easy way to implement pagination with letters
rather than numbers eg :A B C D … Z
I’ve implemented somehting akin to this in my latest Rails app. I have
a partial, called _filter.rhtml, that looks like this:
This creates links for all 26 letters across the top of my list page.
Then, in the controller, I use the :filter param value like so:
def list
params[:filter] = ‘All’ unless params.has_key?(:filter)
if params[:filter] == 'All'
@server_pages, @servers = paginate(:servers, :per_page => 10,
:order_by => 'name')
else
@server_pages, @servers = paginate(:servers, :per_page => 10,
:conditions => lambda { |r| r.name[0..0].upcase ==
params[:filter] },
:order_by => ‘name’)
end
end
So, if a user clicks on “B”, it will show all servers whose name begins
with B. Note that in the :condtions hash value above, I am using a
lambda. This is because I am using Ackbar/KirbyBase as the dbms. If
you are using a regular dbms like MySQL, you would want to use a SQL
statement as your :conditions value.
HTH,
Jamey
Confidentiality Notice: This email message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and/or privileged information. If you are not the intended
recipient(s), you are hereby notified that any dissemination,
unauthorized review, use, disclosure or distribution of this email and
any materials contained in any attachments is prohibited. If you receive
this message in error, or are not the intended recipient(s), please
immediately notify the sender by email and destroy all copies of the
original message, including attachments.
Well, this is an intranet app for my company, so I wasn’t too concerned
about injection attacks when I wrote it, but you do have a good point.
Also, since the lambda is actually a Ruby code block, it wouldn’t be a
SQL injection attack that would have to be used, but, again, in general,
your point is well taken.
Jamey
Kevin O. wrote:
_Kevin
Confidentiality Notice: This email message, including any attachments,
is for the sole use of the intended recipient(s) and may contain
confidential and/or privileged information. If you are not the intended
recipient(s), you are hereby notified that any dissemination,
unauthorized review, use, disclosure or distribution of this email and
any materials contained in any attachments is prohibited. If you receive
this message in error, or are not the intended recipient(s), please
immediately notify the sender by email and destroy all copies of the
original message, including attachments.
I am a bit concerned that the direct use of the params hash in your
conditions would leave you open to SQL injection attacks. Since you are
using a different database, it may be a non-issue, but in general it is
dangerous to put stuff from your params hash directly into your find
statements without some sort of sanitizing.
params[:filter] },
:order_by => ‘name’)
end
end
_Kevin
How about
@alpha = find_by_sql(‘select distinct substr(short_desc,1,1) from
listings
order by short_desc’)
the resultant AR recordset provides only the letters used (why use the
whole
alphabet if only certain letters are used. Then, your pagination links
look
like:
View this message in context:
http://www.nabble.com/Pagination-with-letter-(A-B-C-D-…-Z%29-t1424204.html#a3852071
Sent from the RubyOnRails Users forum at Nabble.com.
Kyle M. wrote:
I’d just like to point out that
“A”.upto(“Z”) do …
is a lot better than
LETTERS = %w(A B C D …
LETTERS.each do
Except for the fact that my LETTERS constant looks like this:
LETTERS = [‘All’, ‘0’, ‘1’, ‘2’, … ‘X’, ‘Y’, ‘Z’]
Because our server names can begin with a number and I also want to give
the user the ability to select all servers.
So, I probably should have picked a different name for the constant, but
I can’t just use #upto like you suggest.
Jamey
I’d just like to point out that
“A”.upto(“Z”) do …
is a lot better than
LETTERS = %w(A B C D …
LETTERS.each do
–
Kyle M.
Chief Technologist
E Factor Media // FN Interactive
[email protected]
1-866-263-3261
<…>
Except for the fact that my LETTERS constant looks like this:
LETTERS = [‘All’, ‘0’, ‘1’, ‘2’, … ‘X’, ‘Y’, ‘Z’]
So, I probably should have picked a different name for the constant, but
I can’t just use #upto like you suggest.
Some typing…
LETTERS = [‘All’,(0…1).to_a,(‘A’…‘Z’).to_a].flatten
Still not sure if this is most optimal way.
On 11/04/2006, at 11:10 PM, Jamey C. wrote:
LETTERS = [‘All’, ‘0’, ‘1’, ‘2’, … ‘X’, ‘Y’, ‘Z’]
Because our server names can begin with a number and I also want to
give the user the ability to select all servers.So, I probably should have picked a different name for the
constant, but I can’t just use #upto like you suggest.
LETTERS = [‘All’]+(“1”…“9”).to_a+(“A”…“Z”).to_a
Avoids all that pesky typing
–
Phillip H.
[email protected]
http://www.sitharus.com/
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs