2008-08-18はいはい、お盆は終わったよ、さーさー働け働けっ!!!
2008年夏、なぜwill_paginateがモテるのか?
will_paginate, v2.1.0, plugins, upgrade
目次
- [will_paginate][v2.1.0][plugins][upgrade] 2008年夏、なぜwill_paginateがモテるのか?
- controller側の対応
- view側の対応
- まとめ
- 移動しました
Rails 2.0.2が出て既に3四半期が経とうとしている(2007年12月リリース)。
ということはそれ以後に作られてきたRailsアプリは従来のpaginate(classic paginate)を使うことはなく、
- will_paginate
- paginator
- pagination_find
あたりを使ってがしがしと開発されていったはずだ。
その数、およそ3,000アプリだ。
ayucat独自脳内調査によれば。
でも、あながち間違いじゃなかろう。
Web系エンジニアって日本だけでも数万人はいる(よね?)って想像しているし、そのうちのPerl/PHP/Python/Rubyを使ってる人でも一万人はいるでしょ!!!
というワケで、3,000アプリ or moreとしておく。
controller側の対応
さて、Rails 1.2で教科書やREADMEの通り、こう書いていただろう:
class ItemController < ApplicationController #... def list @item_pages, @items = paginate(:items, :conditions => 'available = 1', :order => 'pref ASC', :per_page => 10) end end
will_paginationでは、
class ItemController < ApplicationController #... def list @items = Item.paginate(:page => params[:page], :conditions => 'available = 1', :order => 'pref ASC', :per_page => 10) end
と書こう。
ここで、注意したいのはpaginateの第一引数の:pageキーの値。ページ番号を使うクエリパラメータがpageでなかった場合は、それに合わせよう。直さなくてもいい場合が大半だけれども、直す場合はpになっている例が一番多いかな。
view側の対応
<%= pagination_links(@items) %>
あるいは前へ次へだけを表示したくて、
<%= link_to('前へ', :page => @item_pages.current.previous) if @item_pages.current.previous %> <%= link_to('次へ', :page => @item_pages.current.next) if @item_pages.current.next %>
とこれまた教科書どおりに書いていたかもしれない。
前者の場合は、
<%= will_paginate(@views) %>
とだけ書けばいい。
「前へ」「次へ」の場合は、
<%= will_paginate(@views, :page_links => false) %>
とちょっと書き換えるだけ。これで97%の場合に対応できるはずだ。残りの3%のようなマニアックな依頼者は世の中には存在するのだけれども、めんどくさいと片付けてしまうのが一番幸せだし、世の中のためだろう。そうは言ってられないぜ、生活が、、、というあなたでも、既に用意されている細かいオプションを使えばよい。
最後に―私が一番書きたかったのが、これなのだけど―、何件あって、そのどれを表示しているかを伝える
<%= @item_pages.item_count %> 件中 <%= @item_pages.current_page.first_item %>~<%= @item_pages.current_page.last_item %> 件を表示
これ。
last_item.number(last_item.to_s)に対応するのが分かんなくて、困ったから、そこは自分で計算するようにしてしまった><
というワケで私の解答はこれ:
<%= @items.total_entries %> 件中 <%= @items.offset + 1 %>~<%= [@items.offset + @items.per_page, @items.total_entries].min %> 件を表示
ちゃんと用意されてる気がするんだけど、時間内に見つからなかったから、これで凌ぎました、というコード。
大なり小なり、こういう蓄積が溜まっていくから、Railsアプリはエレガントさを欠くんだよな、、、と思いながら。
まとめ
- Rails 1.x時代のpagination (classic pagination)は瞬間的にwill_paginateに移行できるよ(いわゆる秒殺)。
- classic paginationを使ってベタベタにview周りを書いている場合でも、かなり簡単に移行できるよ。
- classic paginationでがりがり:include, :joinsチューニングされているアプリでも、Rails 2.1.0から導入されたnamed scopeを使えば、そこそこ手軽に移行できるはずだよ。
- last_itemの代わりをもうちょっとエレガントに書けるはずだろう。なので、誰か指摘してください><
「classic paginationでがりがり:include, :joinsチューニングされているアプリ」って何それ?って人は今後書くので、楽しみに待ってください^^
2008-06-26
v2.1.0でRuby-GetText 1.91を使うとエラーが起こる原因が分かった
id:ayucat_on_tabelog:20080618:1213805277
に
C:\>ruby script/server => Booting WEBrick... c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:492:in `const_missing': uninitialized constant ApplicationController::GetText (NameError) from C:/code/nrmss/app/controllers/application.rb:12 [...]
と書いたけど、その原因が分かった。
コードを読んだだけで対応はまた後で。
2008-06-20
6月のRails勉強会@東京
先月から調べていて困っていたんだけど、直前になったので、もう一度調べた。
次回の予定
次回のRails勉強会は、いつもの予定だと6/15だけど翌週がRubyKaigi2008なのでRubyKaigiで会いましょう(ということらしい)。
7月は7/20の予定
ということで、予定だと、既に終わっていた!そうか、今月は日曜から始まっていたんだ。
というわけで、RubyKaigi2008には参加しない私は、暇を見つけてUstかUstの録画を観ようと思います(が、きっと観ません)。
2008-06-18
Rails 2.1.0でRuby-GetText 1.91を使うとエラー
既に多数の報告が出ていますが、私の聞いた話だとさらに、別のエラーも起こるようです。
Windows上で、WEBrickを使っている場合に起こっていますが、他の環境でも同じことが起きているかもしれません。
C:\>ruby script/server => Booting WEBrick... c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:492:in `const_missing': uninitialized constant ApplicationController::GetText (NameError) from C:/code/nrmss/app/controllers/application.rb:12 from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:215:in `load_without_new_constant_marking' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:215:in `load_file' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:354:in `new_constants_in' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:214:in `load_file' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:95:in `require_or_load' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:60:in `depend_on' from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:456:in `require_dependency' ... 26 levels... from c:/ruby/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/commands/server.rb:39 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from script/server:3
ひとまず、Rails 2.0.2に戻すように教えましたが、前向きな解決方法は見つかっていません。(そもそも見つける暇がなかった)
なので、詳細については、後日。
2008-03-06
チョロQとアプリバックアップ
App |
d:id:zenpou:20080229:1204300414でチョロQをRailsで動かしてるらしい。
Railsより大半はハード周りだと思うけど、楽しそう。
あと、アプリの退避だけど、
$ scp doruby.tar orenosaba.com:/home/ore
ってあるけど、-Cとかつけないんだろうか。デフォルトでつけてんのかな。