ruby Archive
CakePHPとRuby on Railsの違い
最近、仕事でRailsを使い始めたので、今までよく使っていたCakePHPとどこが一緒でどこが違うのかをざっくりまとめてみました。まだRailsは勉強中なので、理解が不十分だったり間違っている箇所もあるかと思いますが、それらの点についてはコメントなどでご教授いただければ幸いです。
Controller
CakePHPの場合、任意のアクションにおいて、/users/show/katsuma のように、URLで「/」で区切られているものは、アクション以降の文字列も勝手に引数に分けてくれます。なので、アクション側の定義で
function show($id, $name)
のように引数を分けて定義しておいてあげれば、勝手に値が割り当てられることになります。
Railsの場合はconfig/routes.rbで振り分け方法を定義しておいてあげる必要があります。上の例だと
map.connect 'users/show/:id/:name', :controller => 'users', :action => 'show'
こんな感じになるでしょうか。
一方で、Railsの場合、routes.rbはものすごい強力で、map.connetのかわりに好きな名前のメソッドを指定するだけで「(名前)_url」で指定したcontroller, actionなどを含むURLを作成することなんかできたりします。たとえば
ActionController::Routing::Routes.draw do |map| map.berryz '', :controller => "berryz", :action=> "show" end
こんな感じにroutes.rbで定義しておいた上で、
berryz_url(:id => 'miyabi')
で呼び出すと、
http://localhost:3000/berryz/show/miyabi
を意味することになります。Railsすごい。。。!
また、GETで引数指定で渡ってきたも、routes.rbで指定された引数も、すべて param[:hoge]のシンボル指定で取得できるのも特徴でしょうか。
ApplicationController
CakePHPの場合、任意のControllerクラスの継承元であるApplicationControllerは "app/" ディレクトリ直下に "application_controller.php" の名前で設置されます。
Railsの場合は、"app/controllers/" の中に "application.rb"の名前で設置され、その場所と名前が微妙に異なります。
この名前については、これ規約からも外れてるよなぁ。。と思ってたら、どうやらRails 2.3.0からは"application_controller.rb"に名前が変わるようですね。詳しい話はこちらに書いてました。(参照元:そういえば ApplicationController ってファイル名の規約を守ってなかったんだな)
View(レイアウト)
CakePHPの場合、大枠のレイアウトはviews/layouts/default.ctp に、そのレイアウトのHTMLを記述します。
Railsの場合は、views/layouts/application.rhtmlに記述することになり、その名前は異なります。統一性の観点から言うと、Railsのこの名前の方が個人的には好きです。
部分テンプレート
CakePHPの場合、部分テンプレート(element)は、views/elements/ 以下に header.ctp の名前で保存しておきます。elementの呼び出す場合は、View側で
$this->element('header')
の、ように呼び出します。
Railsの場合は、特定のcontroller内での共通テンプレート、全controllerでの共通テンプレートとそれぞれ別に分けることができます。 前者の場合は、 views/user/_header.rhtml のように、"views/controller名/_{部分テンプレート名}.rhtml"の形式になります。 逆に後者の場合、views/shared/_header.rhtmlのように、"views/shared/_{部分テンプレート名}.rhtml" の形式になります。
部分テンプレートの呼び出し方は、前者の場合は、<%=render :partial=>'header'/> のように、後者の場合は :partialで指定する値が"shared/header"のようになります。
この点については、Railsはここまで細かい指定がなくてもいいのにな、、と思います。Cakeの方が直感的な規約だし、呼び出し方も簡単かな、と。
Filter
Cake,Railsともにcontrollerにおいて、その前後にフィルタをかけることが可能です。いわゆるbeforeFilter, afterFilterですね。 Cakeでは特定のController、またはApplicationControllerにおいてbeforeFilter/afterFilterアクションを定義しておくことで、そのフィルタを通すことが可能です。
Railsの場合、フィルタにはメソッドはもちろんですが、クラス、ブロックの3つのレベルで指定可能です。また、複数のフィルタが定義されている場合は、その定義された順番にフィルタが適用されます。
このRailsの細かな指定は凄い、としか言いようがないかんじ。特にブロックで渡すことができる柔軟性は使いこなせばすごく便利そうな印象です。(まだ自分はそこまで使いこなせてません)
静的ファイル
CakePHPの場合、画像やCSSファイルなど、静的ファイル(や、routes.phpのルーティングに外れるもの)は、"webroot/" 以下に設置しておけばOKです。
逆に、Railsの場合は、"public" ディレクトリに設置することになり、そのディレクトリ名が異なっています。
これについては、Railsを意識しまくったCakeとしては、どうしてここの名前だけ変えたのかはよく分かりません。。。
まとめ
ざっと目につきやすい相違点をまとめてみました。Railsについてはまだまだ触り始めたばかりなので、相違点はまだまだあるでしょうし、注意して理解を深めて行きたいと思います。 また、今回こうやって相違点を考えていくことで、むしろお互いの理解が深まるんじゃないかな、とも思っています。
ちなみに、チュートリアルについて、book.cakephp.orgは日本語化されてるわけですが、guides.rubyonrails.orgは日本語化されてないんでしょうか?? すごくよくまとまってそうなので、できれば日本語で読んでみたいのですが。。
Rubyでブックマークカウンタの修正スクリプト書きました
(追記 : 2009/02/12) ソースはgithubでホスティングすることにしました。
ここ最近、このBlogで使ってるソーシャルブックマークカウンタで、deliciousの数がぜんぜん動いていませんでした。どうもドメイン変わった時期の前後あたりから、APIでかえってくるJSONのパースにコケているようで、Perlのモジュールの手を出す方法がさっぱり分からなかったので途方に暮れてました。で、暮れてばっかりだとアレなのでRubyの勉強がてら修正スクリプト書いてみました。超素人コードですけど。
仕掛けは単純で、プラグインをインストールするとmt_bookmark_countってテーブルができるので、そこのbookmark_count_delicous_counter, bookmark_count_total_counterをがしがしupdateさせてるだけです。deliciousのAPIへはまとめて15個URLづつリクエスト投げてます。13, 32行目あたりのDB情報、URL情報を適当に直したら動くんじゃないかな、と思います。
ただ、このBlogのMTもバージョンは超古くて3.3とかだし最近のMTのバージョンでこのプラグインが動くかどうかも定かではないです。。あくまでオレオレパッチ。もしご利用されたい方がいらしたら使ってみてください。要MySQL/Rubyですが、次のサイトに従ってインストールすると楽にできました。
動かし方は上のリンクの圧縮ファイルを解凍し、ruby delicious.rb で動くと思います。あとはサイトを丸ごと再構築すればdeliciousのカウンタも反映されるはずです。
まともにRubyでコード書いたの初めてだったですけど、個人的にはPerlよりも書きやすかったかも。割とさくさく書けて楽しかったです。さらっとツール書くのは便利ですね。
Mac OSXで初めてのRubyを始めてみました
Rubyの勉強を始めてみたくなったので、O'REILLYの「初めてのRuby」
を購入してみました。MacPortsで最新版のRubyを導入しつつ、1章から読み進めているのですが、早速ハマったところがあるのでそのメモを残しておきたいと思います。
Ruby1.9の導入
MacPortsでruby19の名前でインストールできます。
sudo port -d install ruby19
/usr/bin/ruby には、元からインストールされているrubyが入っているので、これをMacPortsでインストールしたものと入れ替えます。(シンボリックリンク張り替えちゃったけどこれでいいのかな?ruby_selectみたいのないのかな)
cd /usr/bin sudo mv ruby ruby.org sudo ln -s /opt/local/bin/ruby1.9 ruby
ruby --version
と、入力して
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9]
こんなかんじの出力になればOKだと思います。
日本語(マルチバイト)の利用
1.5.4制御式のあたりについて。通常だとマルチバイト文字の利用でエラーがでちゃいます。たとえば
p "こんにちわ!こんにちわ!><"
で、
odd.rb:8: invalid multibyte char (US-ASCII) odd.rb:8: syntax error, unexpected $end, expecting keyword_end
などとエラー文が出力されてしまいます。 これは、次のように冒頭に利用するエンコード方式をコメントで書けばOK
#!/usr/bin/ruby
を
#!/usr/bin/ruby # coding: UTF-8
に変更すればOK。
tkパッケージの利用
1.5.5のコールバックのあたりの話。実は冒頭のインストール方法だとtkパッケージがインストールされていないため、利用できません。(require文でコケる) なので、tkパッケージを有効にして入れ直します。variantsオプションで有効なインストールオプションを確認します。
$ port variants ruby19
ruby19 has the variants:
universal
c_api_docs: Generate documentation for Ruby C API
tk: Build using MacPorts Tk
mactk: Build using MacOS X Tk Framework
tk, mactkと似たようなものが2つあります。これ両方有効にしてインストールするとコケちゃいます。とりあえずmactkの方を有効にしてインストールしなおし。
sudo port install ruby19 +c_api_docs +mactk
ところがこれだとエラーでコケます。
Error: The following dependencies failed to build: doxygen graphviz pango urw-fonts
いろいろビルドに失敗しているみたいなので全部個別にインストール。
sudo port install urw-fonts sudo port install pango sudo port install graphviz sudo port install doxygen
この上で、もう一度インストールしなおし。
sudo port install ruby19 +c_api_docs +mactk
これで次のrequire文でコケません。
require "tk"
まとめ
ちょっとづつRubyもわかってきました。これから毎日1章づつくらいのペースで進めていきたいとおもいますよ!