2009年6月20日土曜日

4.railsフォーム作成関数について

HPを作成してゆく際にはフォームの利用は不可避である。railsではこのフォーム部品(テキストボックスやボタンなど)を作成するための関数が定義されている。



私の知る限り、このフォーム作成部品は2種類存在する。

1.モデルと連携してフォーム部品を作成する関数。

2.モデルとは無関係にフォーム部品を作成する関数である。



モデルと連携させてフォームを記述する方法はとても記述が簡単である。そもそも、railsはMVCやファイル名、DBの関係が密接である。

どういうことかというとMVCのクラス名やファイル名、DBテーブル名などは決められたものでなければならないという決まりがある。



仮にUserというモデルを作成するとする。

ruby script\generate scaffold user name:string plan_date:date status:integer comment:text

するとrailsの命名規則により以下のようなファイル名とテーブル名、クラス名が作成される。

ファイル名
コントローラクラス名
UsersController
コントローラファイル名
users_controller.rb
テンプレートのフォルダ名
app/view/users
ヘルパーモジュール名
UsersHelper
ヘルパーファイル名
users_helper.rb
レイアウトテンプレートファイル名
Users.html.erb
機能テストファイル名
users_controller_test.rb
データベーステーブル名
users
モデルクラス名
User
モデルクラスファイル名
users.rb
単体テストファイル名
user_test.rb

このように、コントローラ名をusersとしただけでそれ以外のファイル名やクラス名、テーブル名まで決まってしまう。

一見これは応用性が無く融通の利かないように感じるかもしれないが、こうすることによって多言語ではアクションとモデルとビューおよびテーブルとの結びつきなどを一つ一つ設定していた作業を行うことなく一貫した手法でシステム構築が可能となる。


この考え方がこそが、「設定より規約」railsの基本理念の根幹だ。

私はこの考え方に痛く感動している。rubyが好きな一番大きな理由だ。

さて、話題が大分フォーム作成関数の話からそれてしまった・・・。

これからフォーム作成用関数の説明をしてゆく。

1)モデルと連携してフォームを作成する。

<% form_for(@footprint) do |f| %>
  <b>Article</b>
    <%= f.text_field :article_id %>
<b>User</b>
    <%= f.text_field :user_id %>
  <%= f.submit "Update" %>
  <% end %>

form_for(@footprint) do |f|
の部分でモデル(@footprint)からフォーム作成用インスタンス(
これをフォームビルダーオブジェクトという)を取得し end までの間でフォーム部品を出力している。



フォーム出力関数には以下のような種類がある。


text_field
<input type="text">
password_field
< input type="password">
hidden_field
< input type="hidden">
text_area
< textarea>
check_box
< input type="checkbox">
radio_button
< input type="radio">
select
< select> option配列を忘れないように
date_select
コンボボックス3つ(年、月、日)
file_field
< input type="file">


以上のメソッドを利用することで簡単にフォームを作成することができるようになる。
f.text_field :name
     ↓
<input id="user_name" name="user[name]" type="text"
  value="しあさん" />
このように、 f.text_field :name しかしていないにも拘らず自動的にモデル名も含めたname,id属性や初期値(value)を記述してくれる。

これを可能にしているのがrailsの基本設計の"設定より規定"の概念だ。

このように、モデルに関係するデータを扱う場合フォームビルダーオブジェクトを利用すると簡潔にコードを記述できる。

しかしながら、フォームの用途はモデルのデータを扱うためだけではない。そこでrailsではモデルからフォームを作成する関数以外に単純に(フォームとの連携なしに)フォームを作成するが可能なメソッドが定義されている。

モデルとは無関係にフォーム部品を作成する関数


これは次回記述します。

眠いので

2009年6月19日金曜日

3.RoRルーティング処理について

railsでのREST設計と密接な関係にあるのがこのルーティングの設定である。

要は、このURLとこのHTTPメソッドでアクセスがあった場合はこのページにアクセスさせるといった感じのページ遷移の設定だ。
この、ページ遷移の設定ファイルはrailsプロジェクト内のconfig/routes.rbファイルである。

今まで、俺はRESTのことを学習するまでrailsのページ遷移を以下のように記述していた。
map.connect("users/login",:controller=>'users',:action=>'login');

つまり、コントローラにusers, アクションにloginが指定されたら、usersコントローラーのloginメソッドに処理を渡すという記述である。
もちろんこの処理を書くことでそのページへのページ遷移が可能となる。しかし、railsが持っているRESTの機能を生かした方法とはいえない。

つまり、この記述方法ではどのHTTPメソッド(GET,POST,PUT,DELETE)でもアクセスできてしまい。本来のRESTの規則から逸脱してしまっている。


開発を行っているフレームワークがrailsであるのなら開発者はそのrailsに合わせるの筋である。

なので、本来は上記のようなルーティング設定方法ではなく以下のようにHTTPメソッドも含めた形で行うべきである。
map.resouces(:users,:collection =>{:login=>:get}); として行うべきだ。

この場合のアクセスURLとHTTPメソッドは~~~/users;login (GET)となる。

:collectionというのはindexやcreateなど複数のリソースを扱う類のフォームで使用し、それ以外にも:new(newアクションつまり新規登録フォームの類)、:member(show,edit,update,delete=つまり、個別のリソースを扱う類)といったシンボルが使われる。
(俺は、いまいちこの違いがつかめていない・・・・)

ちなみに、もともと map.resources :users というメソッドが記述されているが、これはindex,create,show,update,destroy,editといったCRUDのためのページへのルーティングを追加するための記述だ。ちなみに、indexとcreateは同じURLでアクセスだがHTTPメソッドの種類によってどちらを表示させるか制御しているし、 show,update,destroyも同じURLだがHTTPメソッドの種類によってその表示ページを制御している。
(これを知って、俺は今までURLの事で不思議に感じていたなぞが解けた)

これまで、RESTを考慮したrailsの設計について書いてきたが実はこのRESTで考えられているHTTPメソッドのうちPUTやDELETEは現在のブラウザでは未だ対応していない。
つまり、実際に<form method="put">などとしてページ遷移の記述を行うとブラウザが対応していないため正常にアクセスできない。
ではいったいrailsはどのようにしてRESTの設計を導入しているの・・・・。それは、PUTやDELETEメソッドで送信したい場合は実際には<form method="POST">としてデータを送り、form内で<input type="hidden" name="_method" value="put" />と記述することでこのRESTの思考を仮想的に実現させているのである。

最後に、デフォルトの7アクションのURLとHTTPメソッドの関係の表を乗せておく。
(一応コントローラにも記述してあることだが・・・)



アクションURLHTTPメソッド
index /usersGET
new/users/newGET
create/usersPOST
show/users/123GET
edit/users/123;editGET
update/users/123PUT
destroy/users/123DELETE


取りあえず今日はここまで。

2009年6月18日木曜日

ReSTfulについて

今回はrubyでのURLマッピングの方法とRESTフルの考え方について勉強してみた。

RESTフルっていうのは正直初めて聞いた言葉で当初検討もつかなかった。
同じ会社の方からのメールの内容に書いてあったのだが全くわけが分からなかったのでちょっち調べてみた。

まず、そもそも、RESTってなに??ってところから調べていったわけだが、ここに分かりやすく書かれていた。

要は、WEBページでのデータの取得・登録・更新・削除の処理をURIとHTTPメソッドのGET、POST、PUT、DELETEを適切に使って行う方法ということらしい。

そういえば、railsでページ遷移を行う際に正しくURIを記述しているにも拘らず、正常にページ遷移できないということがあり、 GETをPUTにしたらアクセスできたなんてことがあった。

現在、一般に利用されているページ遷移の方法はURLとGETかPOSTを利用する方法が主である。
そして、俺もrubyを学習するまで変数の受け渡しは GET、POSTで行うものだと思っていたし、GETとPOSTの違いについてさほど深く考えてすらいなかった。
HTTPメソッドの利用方法は本来以下のようにして行われるべきもので、現在のようにあらゆる処理に対してGETやPOSTでのアクセスを許可するべきではないらしい・・・。
ちょうど、IPアドレス(URI)とポート番号(HTTPメソッド)のような仕組みだ。

メソッド役割
GETリソースの取得。GETでのアクセスはリソースの内容に影響を与えない。
POSTリソースの新規作成
PUT既存のリソースのアップデート
DELETEリソースの削除

RESTとはURIが指し示すリソース(つまり、htmlファイル・画像)に対して、HTTPメソッドを本来の意味で利用することで、そのリソースに対して何をしたいのか、を指定できるようにしようと提唱しているのだ。
そして、このRESTの考えを忠実に再現することをRESTfulというらしい。
俺はこの考えは好きだ。うまく説明できないが、ある物事を実行するとき何かしら規約・信念をもって取り組むのは決してめんどくさいことではなく分かりやすく、間違いの少ない手法だ。

俺は、rubyの設計哲学であるDRY(Don't Repeat Yourself)や設定より規約(convention over configuration)といった考え方が大好きだ。今回のRESTはこれと似た匂いを感じる。

rails2.0以降はこのRESTfulのシステムが導入されているらしい、なんか面白くなってきた。

2009年6月15日月曜日

Flashはじめの一歩

唐突ですがFlush勉強することになりました。
正直Flushのこと何も知りません。ActionScriptって言語を使うってこと、そしてブラウザで動いてる動画という印象しか浮かんできませんww

そんな状態なんで取りあえず、Flushとは何なのか、そしてその作り方を基礎から勉強してゆきます。

取りあえずググって見て、参考にしたHPは以下のやつ。
flush基礎

どうやら、flushはActionScriptをゴリゴリ書いていくんじゃなくソフトを使って開発してゆくスタイルみたいです。
グラフィックに特化した言語なのでやはりその開発方法もGUIにしやすいんでしょうね。もちろん、ActionScriptをゴリゴリ書いてもいいんだろけど便利なツールがあるなら使うまで。
どうやら、ADOBEのflus開発ツールが良いらしい。
そいや、職業訓練でフォトショップやらイラストレータ・ドリームウィーバーなどのCS2使ってたとき一緒にはいってたな・・・・。

一応ダウンロードしようかとDLサイトへ・・・
え!?9万!?単体で?高ッ!
まあ、うわさでは聞いてたんですが・・・予想以上でした。
とりあえず、30日無料体験版というのがあったんでそれを使うことにしました。
なんか、仮想環境でインストールしたら何度でも使えるとか、レジストリ書き換えれば無料期間延長できるっていう噂は聞きますが取りあえず今回は善良な市民ということでインストール^^
adobe flush 体験版DL(ログイン画面)

ダウンロードが終わったらインストール取りあえずめんどくさかったんでデフォルトの状態で”次へ”をクリックしていきました。

無事インストール完了し起動した画面がこれ。




ちょっとかっこいいb(落書きは無視してくださいww)
ウィンドウの上のバーが無い機能的なところ俺的には好きです。
大体こういった開発系ソフトはやけにwindou内にブロックがたくさん必要で、狭い画面で作業しないといけないんで上のタイトルバーがないのは素敵でした。今後のwinndowの革新的なスタイルですb
是非Eclipseなんかも採用してもらいたい!!

ちょっと長くなりましたが、今日はここまで。
操作方法は追々やっていこうとおもいます。

2.RoRプロジェクトの作成とCRUDの機能作成

railsプロジェクト作成

ワークスペースに移動し rails -d 使用DB名 作成プロジェクト名
ex) >rails -d mysql memopad


DB設定入力

config/database.ymlに設定情報記入
config/database.ymlの設定を元にDBユーザーを作成

config/environment.rbファイルの先頭に
$KCODE = "UTF8" を追加

mysql設定ファイルmy.iniの最後に
default-character-set=utf8
skip-character-set-client-handshake を記述
その他、character-setがutf8以外になっていた場合は変更しておく。

DB設定情報(onfig/database.yml)をもとにDB作成
rake db:create:all

コントローラー、モデル、マイグレーションファイル,スキーマファイルなどを一括作成。
ruby script/generate scaffold 作成テーブル名(単数形) カラム名:型 カラム名:型 ・・・
ex)ruby script\generate scaffold function name:string plan_date:date status:integer comment:text

マイグレーションファイルを元にテーブル作成
rake db:migrate(バージョン指定はVERSION=2など)

DBを開きshow columns from table名;でテーブルを確認。指定したとおりに出来ていなかったり、追加したい場合はdb\migrateフォルダにファイルを追加して再度rake db:migrateを行う。

以上でCRUDの機能は実装できる。

1.Ruby開発環境構築(MySQL、RoRの導入)


ruby(one-click installer)ダウンロード・インストール

rubyの環境構築はRuby本体とRakeRubyGemsの3つが必要になる。通常はこの3つをそれぞれダウンロード→インストールしていくのだが、同時に3つともインストールできるOne-Click Installerなるものがある。↓
http://rubyforge.org/projects/rubyinstaller/
インストール後、ruby.exeにパスを通しておく


rubygemsのダウンロード

http://rubyforge.org/projects/rubygems/

rubygemsを展開し、rubyのホームフォルダに入れる。
rubygemsフォルダで”ruby setup.rb”を実行する。

railsのインストール

gem install rails --include-dependencies [バージョン指定は -v 2.0.2 など]

以下のようになっていればよい。

   

どうしようもないクズのアーチャー