Archive for category <技術一般>

kaminari gem を Padrino で使うには

Time to Read

2分

明けましておめでとうございます。ブログもぼちぼち通常営業です。

先日ぼくの(github:mlightner氏や @aereal 氏の実装を大きく参考にしたものです)Sinatra系対応パッチがマ~ジされました、次世代ページネーションエンジン kaminari ですが、昨年末にそのパッチを含む 0.13.0 がリリースされています。

早速使ってみたいところですが、時期的に、ちょうど Rails 3.2RC やら Rack 1.4 やらが出ていて、設定にややコツが要るのでそこだけメモしておきます。Padrino の例ですが、 Sinatra でも適宜読み替えてください。

プロジェクト作成

1
2
padrino g project kaminarino -d activerecord -a sqlite -b
cd kaminarino

Gemfile を編集

15
16
17
# rack のバージョンを 1.3 系に指定しないと、最新の rack 1.4.0 が入って面倒な事態になる
gem 'rack', '~> 1.3.0'
gem 'kaminari', '~> 0.13.0', :require => 'kaminari/sinatra'
1
bundle update

試してみよう

1
2
3
4
padrino g model user name:string
padrino rake ar:migrate
padrino g controller users get:index
padrino console
1
2
>> 100.times { User.create!(name: SecureRandom.base64(12)) }
>> exit

app/app.rb:

1
2
3
4
5
class Kaminarino < Padrino::Application
  #...
  register Kaminari::Helpers::SinatraHelpers
  #...
end

app/controllers/users.rb:

1
2
3
4
5
6
Kaminarino.controllers :users do
  get :index do
    @users = User.page(params[:page] || 1).per(5)
    render :"users/index"
  end
end

app/views/users/index.html.haml:

1
2
3
4
5
6
7
8
9
10
11
!!! 5
%html
  %head
    %title= "users page: #{@users.current_page}"
  %body
    %ul
      - @users.each do |user|
        %li
          = "User ID: #{user.id} |"
          =h user.name
    = paginate @users
1
padrino start

で、とりいそぎ paginate ヘルパーなどを移植したのですが、実は生成される URL は機械的に後ろに「?page=n」をくっつけているだけだったりして色々と申し訳ない感じなので、何というか、こう、ユーザ側で自作した方がうわなにをする

もうすぐ Rails 3.2 の正式版が出て、 rack 1.4 を考慮した依存関係になるとのことで(参考ポスト)、一緒に Padrino なんかも対応してくれるはずですので、それまではちょっと最新の rack が使えませんが待ちましょう……。

# 少しだけそもそも論的な話をすると、 kaminari 自身が actionpack に依存していること、そして、実は Sinatra 側のヘルパーも ActionView を利用している(移植の工数を最小限にするために……)ことが問題を難しくしている感じもありますが、ここはこう、きっといい方法があると思って考えて続けています(helpersだけでも別の gem に切り離すと綺麗なのかもなあ~とか)。

何かご意見があればお気軽に @a_matsuda さんや ぼく まで~。一応、 Sinatra 関係の改修のメンテナを立候補させていただきましたので……。

 

2011 年の自分まとめ featuring blog.udzura.jp

Time to Read

3分

Read the rest of this entry »

 

「年末年始休暇に読みたい! Rack について参考になる記事まとめ」について

という地味な「はてなまとめ」記事を作りました。適宜ツッコんだり、サンプルを追加しちゃってください。

どんなスポーツでも体幹を鍛えるのは重要ですし、今やほとんど全部の Ruby 製ウェブアプリケーションで「Rack」は重要な幹となるべき位置を占めていますので、これを機会に再入門の時間を取ってみるのもいいのではないだろうか~と。何より重要なこととして、そんな、難しいものじゃないんですよ。とってもシンプルで綺麗です。ぼくも、そろそろ rack/rack をちゃんと読んだりしたいです……。

あと、「はてなまとめ」、というかまとめ系ウェッブサービスを初めて使いました。なので、こなれていないところがあるかと思います。

 

rack-block という Rack Middleware をリリースしました

ついさっきリリースしました。検索ボットなどのアクセス避けに使えたりします。

使い方はREADME.md、もしくはspecを。あとでちゃんとドキュメントすると思います。

内部は(まだ)いろいろ凄いので、あんま突っ込まないでください……

では、メリークリスマス!!

 

.rb勉強会(第1回)参加しました

facebook でつながった(ソーシャル的常套句)人たちとルッビーの勉強会をやり、僕は僕の妄想的な主張を形にして発表したりしました。

.rb勉強会資料 – はじめる! Ruby de Web 開発

「またいつもの主張かよ~」 と思う向きもありそうなんですが、割と好評だったようで大変うれしく思いました。あと、「Sinatra楽しい!」と多くの人に言っていただけたのはよかったです。

ツッコミがあったので、補足すると、 Java は Rack 等の登場以前からJavaサーブレットのような技術でアプリケーションとサーバの抽象化を行っています。ただ、 Rack の方がよりシンプルになっていて、かつ動的型である Ruby(きっとPython/Perlも) の特徴に見合った実装になっていると思います。 PHP の場合は会場でも意見があったとおりそもそも Web 専用なので特別に WSGI/Rack 的なレイヤーを切り出していないということなのでしょう(2011/12/21 14:31)。

会場の Jelly Jelly Cafe 自体もかなりカオスで面白かったです。もっと時間をゆっくりとってもくもくしたりもできれば楽しそうだな~とか思ったりもしました。第2回に期待です。