observe

分かっている人には分かっている事。
ちょっとはまったので、備忘録として。
以下、prototype.js という JavaScript のライブラリの話。


window.onload = function (){
alert("ウホッ");
}


まず、これが第一段階。
ロード時に、無名関数を使ってウホッと警告を出します。
むしろウホッに対する警告?
まあ、それはともかく、ここまではOK。

次の段階。


window.onload = function (){
alertUho();
}

function alertUho(){
alert("ウホッ");
}


さっきのを、関数でやっているだけです。
ここまでもOK。

そして次。


window.onload = function (){
Event.observe("div001", "click", func001(1), false);
Event.observe("div002", "click", func001(2), false);
}

function func001(num){
alert("IDはdiv00" + num + "です");
}


たとえとしてよくありませんが、これがなぜかうまくいかない。
具体的には、読み込んだ瞬間にアラートが出て、後は handler が云々いうエラーになってしまいます。
おかしいと思ったら、observeで呼び出されたメソッドには、必ずイベントオブジェクトを引数に持たせないといけないんですね。


window.onload = function (){
Event.observe("div001", "click", callBy1, false);
Event.observe("div002", "click", callBy2, false);
}

function callBy1(e){
func001(1);
}

function callBy2(e){
func001(2);
}

function func001(num){
alert("IDはdiv00" + num + "です");
}


これは確かに動きます…が、何か冗長な感じですね。
イベントを引数に持たせるとして、二つ以上の引数を渡す方法はないものか…?

まとまった資料がないため、JavaScript はどうしても体当たりで覚える方式になりがちです。
求む、よい資料。
プログラム | comments (28) | trackbacks (0)

バリデーション

フォームのバリデーション、と聞いても普通の人には分からないかもしれませんが、こういう経験はありませんか?

例えば、会員制サイトの会員登録。
メールアドレスが必須になっているのに、空のまま先に進んだら

メールアドレスを入力して下さい

の文字とともに、入力画面に戻されてしまった。

こういうのをバリデーションとか呼びます。validation です。

さて、本題。
自分用ツールでもこのバリデーションを一応かけようと思ったのですが、普通にかけても面白くない。
そこで、『Realtime validation using Ajax』というライブラリを使おうと思いました。
これについてはこちらを参照。

使い方は簡単で、prototype.js と validate.js を読み込んだ後に、自分で定義したバリデーションを.js ファイルなりで読み込ませるだけ。
順番は必ずこのとおりで。
バリデーションの定義も結構簡単で、正規表現が分かればすぐに使えます。
一応サンプル。

<input id="name" name="name">

上のタグに、『必ず入力して下さい』というメッセージを表示する場合。


Validator.register({
"#name" : {
"/^$/": "必ず入力して下さい",
"/*+/": "OK."
}
}


見てのとおりですが、一番上に対象のIDを指定、下に正規表現で条件と、表示メッセージを記述していきます。
複数のIDに指定する場合、それぞれを,で区切ればOK。
クラスでも指定できるみたいですが、なぜかうまくいきませんでした。

で、これを自分のアプリで使おうとしたら…動くには動くものの、FireBug がエラーを検出します。
どうやら、prototype.js のバージョン差の問題?
中身を解析する元気が出なかったので、今日はここまで。

せっかくなので、自分で簡易式のこれを作ってみますか…
続きは(元気なら)明日にでも。
プログラム | comments (29) | trackbacks (0)

in_groups_of とか group_by とか

Rails の独自拡張機能で、in_groups_of というメソッドがあるのはちゅう君も書いているとおり。
簡単なようで実はミスしやすい、『配列を10件ごとに<div>で区切って表示』とかを簡単にやってくれます。


<%- @items.in_groups_of(10) do |group| -%>
<div>
<%- groups.each do |i| -%>
<%- break if i.blank? -%>
<%= i.name %>
<%- end -%>
</div>
<%- end -%>


こんな感じ。
@items は絶対 size > 0 な配列で、i には name というフィールドが存在する前提で。

これだけでも使いやすくて感動なのですが、group_by というメソッドもあるようです。
こちらは、配列の中に入っているオブジェクトを、あるフィールド別でグループ化してくれるメソッド。
言葉だととても伝わりにくいので、使い方はこんな感じ。
まずはコントローラで、こんな風に。


@items = items.group_by do |item|
item.created_at.year
end


続いてビューで、こう。


<dl>
<%- @items.each do |year, items| -%>
<dt><%= year %></dt>
<%- items.each do |i| -%>
<dd><%= i.name %></dd>
<%- end -%>
<%- end -%>
</dl>


今度は、さっきの i が created_at という datetime なフィールドを持っている前提で。
こちらは、このとおりに使えるのかは不明ですが、Ruby 1.9 から組み込み関数として使えるらしいです。
Rails からの逆輸入?それとも以前から想定済?

以前の案件で、作者を肩書き別でグループ化するというのがあって、必死でやったけどこれを使えばどう見ても一発です。
プログラミングって、ときどきこういう単純に知ってるもの勝ちみたいな事がありますね。
プログラム | comments (52) | trackbacks (0)

リラックス

何か、結局コードを書いている時が一番落ち着く…
酒に走ったりするよりよさそうなので、しばらく元気のあるときはコーディングにします。

で、Railsのプラグインを1個作りました。
その名も『mahjong』プラグイン。
簡単なビューの拡張で、麻雀の手牌を簡単に再現するためのもの。

<%= hand [1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 1, 2] %>

とか、こんな使い方をします。
はっきり言って<img>タグを使えば一緒なので、単なる自己満足。
単純に、プラグインがどうやって実現されているのかに興味があっただけです(単に、モジュール作ってrequireしたりするだけなんですね)。

で、せっかく作ったので自分のBlogに適用…と思っていたら、本文はDBに入っていて動的に呼ばれるんだから、単純にヘルパメソッド呼んだだけじゃ意味ないじゃありませんか。
永遠にお蔵入り決定。。。
むしろ入力支援用のフォームを、JavaScriptで作ればよかったのか…

夜も眠れないので、このまま朝までコーディングです。
プログラム | comments (44) | trackbacks (0)

rjs in rails 2.0

どうやらRJSの使い方も変わった様子。

例えば、こんなのを考えます。


<%= link_to_remote 'テスト',
:url => {:action => "test"} %>
<div id="target">
test
</div>


これに対応するメソッドは、こう。


def test
respond_to do |format|
format.html
format.js
end
end


この場合、test.js.rjsというファイルが必要になります。
その中身は今までとほとんど一緒。

page[:target].replace_html :partial => 'test'

ちなみに、xmlとかも指定できて、その場合はそれ用にtest.xml.erbとかが必要になります。
まあ、すべてrenderオプションで指定すればそれが呼ばれるわけですが。

例えば上の例で、RJSを使わない場合はこう。


def test
respond_to do |format|
format.html
format.js do
render :update do |page|
page[:target].replace_html :partial => 'test'
end
end
end
end


ちょっとめんどくさいですが、理にはかなっている気がします。
必ずフォーマットを指定するようになった、と。
REST対応の影響なんでしょうか?
Rails1.2でどうだったかは覚えていませんが…

ちなみに、JavaScriptが使えない事を考慮しなければ、こうも書けます。


def test
render :update do |page|
page[:target].replace_html :partial => 'test'
end
end


これは割りと早い。

viewの:updateを使うともっと簡単に。



<%= link_to_remote 'テスト',
:update => "target",
:url => {:action => "test"} %>
<div id="target">
test
</div>



def test
render :partial => 'test'
end


以上。
日本語でまとまったページがなかったので、自分でてきとーに。
ネタ元はこちら

Thanks a lot!
プログラム | comments (156) | trackbacks (0)

CSSメモ

とにかくすべてのmarginとpaddingを0にしたいんだ!という場合。

* {
margin: 0;
padding: 0;
}

こうすると、とりあえず全部リセットできます。
今日、会社で教わりました。

デザインセンスは皆無なのですが、それっぽく作れるCSSは結構好きだったりします。
ただ、細かいところで言うことを聞いてくれないんですよね…

自作Blogツールですが、現在管理部を作成中。
自分しか使わないのをいい事に、色々遊んでいます。
プログラム | comments (26) | trackbacks (0)

発想の転換

最近あった本当の話。

ローカルでうまくいき、テストサーバでもうまくいったソートが、なぜか本番環境で失敗している…
原因を調べたら、DBMSのバージョン差で、初期化時にオプションを指定しないと正しくソートされないとか何とか。
なんじゃそりゃ、今からDBの再構築なんて怖くてしたくねぇよ!と思っていたら、同僚が一言。

「アプリ側でソートすりゃよくね?」

はい、ソートはDBでやるもんだ、という発想が強すぎて、そこに気がついていなかったんですね。
表示件数はせいぜい1,000件止まりだし、それならDBでやってもプログラムでやっても大差ありません。

このように、便利なツールに頼っているとそれ以外の選択肢を忘れてしまう事がよくあります。
発想を柔軟に保つには、一旦落ち着いて、他の方法がないのかどうか、きちんと考える事ですね。

新年初エントリーがこんなのですが、今年もよろしくお願いします。
プログラム | comments (35) | trackbacks (0)

ActiveScaffoldで自己参照

Rails 2.0特有の問題なのかどうかは不明。
ActiveScaffoldで自己参照テーブルを扱おうとしたのですが、以下のようにするとうまくいきませんでした。

class Category < ActiveRecord::Base
has_many :categories, :foreign_key => :parent_id
belongs_to :category, :foreign_key => :parent_id
end

これだと、動くには動くのですが参照先がおかしな事に。
具体的には、has_manyのリンク先が怪しい事になります。
そこで、これをこのように書き換えます。

class Category < ActiveRecord::Base
has_many :children, :class_name => 'Category', :foreign_key => :parent_id
belongs_to :parent, :class_name => 'Category', :foreign_key => :parent_id
end

すると、あら不思議。
これだけできちんと自己参照が定義できたじゃありませんか。
今のところ挙動におかしなところもないし、これが正解?
まだまだ、Railsデフォルトの機能に対する理解が浅い気がします。
とりあえず、当面の問題は解決したのでBlog開発を続けます。
プログラム | comments (86) | trackbacks (0)

ちょっとした問題

Rails2.0では関連に関する機能が強化されています。
例えば、自己参照もとても簡単に実現可能。

今までは

class Category < ActiveRecord::Base
belongs_to :parent, :class_name => "Category", :foreign_key => "parent_id"
has_many :categories, :foreign_key => "parent_id"
end

と、書かないといけなかったのが、簡単に記述できるようになりました。

class Category < ActiveRecord::Base
belongs_to :parent, :class_name => "Category"
has_many :categories, :foreign_key => "parent_id"
end

以上、ネタ元はこちら

まあ、ちょっとタイピングが減るよって程度なんですが、困った事にこれがActiveScaffoldでは動作しません。
Rails2.0のリリースが12月6日なので対応している方がすごいですが、今のところ上の方の書式でないと、エラーが出てしまう模様。
こんなのではまる人もいないと思いますが、備忘録程度に。

ついでに、Rails 2.0対応な標準機能まとめを追記に。
続きを読む>>
プログラム | comments (4) | trackbacks (0)

ActiveScaffold

会社のWikiに書いたものだけど、家で見たかったので転載。

長いので追記で。
続きを読む>>
プログラム | comments (476) | trackbacks (0)