Rails 勉強会@大阪 -002 cuzic
今日はなすこと 相対パスプラグイン Double Filter Plugin 埋め草 –Cuzic の環境とか –1 つのボタンで複数の Ajax なアクションを実 行
Relative Path Plugin Ruby On Rails の url_for などを相対パス 表記にするプラグイン – 本来、 Ruby On Rails では必ず絶対 URI になる。 動機 –./script/server の Ruby On Rails を apache の 任意のパスにマウントさせたい! – プロキシ環境とかでも便利!
まず、プロキシについて Apache には超簡単なプロキシ機能が実装 – mod_proxy – mod_rewrite これらを使うことで、見かけ上の URI と実際 にコンテンツがある URI を独立に構成できる。 mod_proxy なら ProxyPassReverse /demo mod_rewrite なら RewriteRule ^demo/(.*) [L,P]
Apache 以外にも便利なプロキ シ pound – ロードバランスの機能もあったり stone とか delegate とか – いわゆるパケットリピータ系 – ssh ポートフォワードも同種 有名なのは、 squid とか
使い方./app/controller/application_controller.rb Class ApplicationController < ActionController::Base include RelativePath End 簡単だね!
苦労どころ Rails は、無名クラスを使いまくり。 – かなり追いかけないと、拡張すべきクラスが 分からない redirect_to –RFC では絶対 URI と書かれている・・・。 – けど、相対パスにしても大抵のブラウザでも 動くからいいよね。いいよね。
仕組み 結構単純 – オリジナルの url_for で作るパスの前に、 ”../” を適切 な数加える。 def relative_path_prefix count parents = ["."] if count > 1 parents = [".."] * (count - 1) end pdir = parents.join("/") pdir end
リダイレクトでは(1) HTTP リダイレクトの仕組み –HTTP レスポンスヘッダの Location フィール ドに、リダイレクト先の URI を記述 Action Controller が相対パスの location を 渡しても、 Webrick が勝手に、絶対パスに 変換する。 – うきー!うきー! – これも相対パスにしよう! RFC では、単一の絶対 URL を記述と明記されて いるが、実は相対パスでも動作する。 ここをなんとかしないと、任意のディレクトリに 描画できない
解決法 Webrick 側に細工 –Location ヘッダを相対パスで出力させて、解 決 module WEBrick class HTTPResponse alias_method :setup_header_absoluteuri,:setup_header def setup_header() if location = location else setup_header_absoluteuri end
Double Filter Helper 2 軸あるデータをフィルタするときに有効 なヘルパー – 例 地域 + 顧客名, 顧客名 + 商品名 ドロップダウンリストボックスでお互い をフィルタ
機能 フィルタ順の指定 –A => B –B => A ドロップダウンボックス A が変化すると、 – ドロップダウンボックス B も変化 ドロップダウンボックス B が変化すると、 – 表示しているリストを変化
使い方 若干複雑 class SomeController < ApplicationController include DoubleFilterHelper double_filter Model, “longname0" => “s0",“longname1" => “s1” end ・その後、 rhtml ファイルをいくつか追加 このあたりは generator にしないと・・・。 複雑な設定が必要な generator はどう作ろう?
次のメソッドを追加 (1) SomeController#collect_column_information SomeController#list2 SomeController#filter_from_form SomeController#filter_
次のメソッドを追加 (2) ApplicationHelper::JavaScriptHelper# double_filter_radio_button double_filter_dropdownlist double_filter_js
苦労どころ Rails の Java Script まわりを勉強しなが ら – かなり、ソースコードを読み解きながら学習 日本語の関係 – ブラウザ用、スクリプト、 DB 設計レベルで悩む – ジェネレータか、プラグインか
プラグイン vs コードジェネ レータ プラグインのいいところ – バグが後で見つかったときに1つ直せばすむ – コードが集中する コードジェネレータのいいところ – あとで、ユーザが個別の変更を加えやすい – rhtml とか、 yml とかも守備範囲
今回は実装にプラグインを採用 なんとなく、無名モジュールを活用した くて – あまり、使ったことがないテクノロジー –Rails で多用されているし コードジェネレータは最終形という思い – デバッグがプラグインに比べて面倒 – そもそもきれいな実装にしてから、コード ジェネレータにしないと、後で大変なことに なる
Double Filter Helper の構成 Javascript Helper – ドロップダウンボックスの状態変化を担当 Controller Helper – ドロップダウンボックスの値を DB から収集 – フィルタ後のリストを出力
連続 Ajax 1つのコマンドボタンで少し時間のかか る DB への検索等を一発で行うツールを作 成したかった Ajax を使うと、検索結果が返る度にレス ポンスが得られて便利 キャンセル機能の実現 –DB サーバの不調のときは、ブラウザ側から 強制キャンセルを実行可能
仕組み やっていることは単純 –Java Script の中で、多数の Ajax.Updater を 呼んでいるだけ。 – キャンセルボタンを押すと、 XMLHTTPRequest の abort() メソッドを呼ぶ。 – 何気に、 Ajax でステータスを更新したり。 – ほとんど Java Script で記述。
まとめの前に 現在、これらのツールは、 rubyforge.org で公開するように作業中です。 – svn+ssh で rubyforge.org にアクセスできな いことが原因で中断しています。 Excel ワークシートの出力は時間があると きにやります。 – 他にやりたいことも多いのだけれど。
まとめ 強制的に相対パスで出力すると、任意の ディレクトリで表示可能です。 2項目でフィルタ検索を簡単にするジェ ネレータ / プラグイン作成中です。 連続して、 Ajax.Updater を繰り返し実行 する機構とかも作りました。 ご静聴ありがとうございました。