Ruby on Rails の規約 - まとめ
目次
ファイル構成
- app
- Railsアプリケーションの実行ソースコード
- components
- コンポーネント
- config
- Railsアプリケーション全体の設定ファイル
- db
- データベースに関係するファイル
- doc
- アプリケーションに関係するドキュメント
- lib
- アプリケーション内で共通して使用するRubyライブラリ
- log
- Railsアプリケーションの動作記録(ログ)
- public
- Railsアプリケーションのドキュメントルート
- 画像やJavaScriptなど、静的なWebコンテンツ
- script
- ジェネレータやWebサーバの実行用スクリプトなど、Railsアプリケーションの操作用コマンド
- test
- Railsアプリケーションのテストやテスト用データ
- tmp
- Railsアプリケーションを実行した際に生成される一時ファイル
- vendor
- Rails用プラグインなどを保管するディレクトリ
URL形式
基本
- http://URL文字列/アプリケーション名/アクション名
- app/controllers/アプリケーション名_controller.rb の アクション名 メソッド
- app/views/アプリケーション名/アクション名.rhtml
- app/views/layouts/アプリケーション名.rhtml
- アクション名を省略した場合は、index アクションが呼ばれる
パラメタ渡し
- http://URL文字列/コントローラ名/アクション名?変数名=値
- params[:変数名] #=> 値
- http://URL文字列/コントローラ名/アクション名/値
- params[:id] #=> 値
コントローラとビューの関係
- 返却対象(レンダリング対象)が指定されない場合、アクション名と同名のビュー・テンプレートファイルを呼び出し、その評価結果をブラウザに返す
- ビューのRHTMLファイル内で評価されるRubyコードは、コントローラのスコープで評価される
部分テンプレート
- 部分テンプレートファイル名は、アンダースコアで始まる
- _example.rhtml
- 呼び出し側テンプレートから呼び出す場合は、アンダースコアを取る
- render :partial => "example"
単数形と複数形の使い分け
| どんなとき? | 単数形 | 複数形 |
|---|---|---|
| ジェネレータ | ruby script/generate model Person | - |
| モデルジェネレータで生成されるファイル | app/models/person.rb, test/unit/person_test.rb | test/fixtures/people.yml, db/migrate/001_create_people.rb |
| モデルとテーブルの対応関係 | Personクラス | PEOPLEテーブル |
| Personモデルに対してリレーションを設定 | has_one :person | has_many :people |
命名規則に従うためのツール
ある単語の単数形と複数形を確認する
- > cd RAILS_ROOT
- > ruby script/console
- >> puts "person".pluralize
- #=> "people"
- >> puts "people".singularize
- #=> "person"
ラクダ表記(キャメルケース)とアンダースコア表記を変換する
- > cd RAILS_ROOT
- > ruby script/console
- >> puts "recorder_player".camelize
- #=> "RecorderPlayer"
- > "KomasuiRecorderBu".underscore
- # => "komasui_recorder_bu"
数を序数にする
- > cd RAILS_ROOT
- > ruby script/console
- >> puts 1.ordinalize
- # => "1st"
- >> puts 2.ordinalize
- # => "2nd"
- >> puts 3.ordinalize
- # => "3rd"
規約より設定
- モデルクラスで管理対象テーブルを指定したい!
- set_table_name :テーブル名
- 主キーを変更したい!
- set_primary_key :カラム名
- テーブル名の複数形化を無効にしたい!
- RAILS_ROOT/config/environment.rbに、ActiveRecord::Base.pluralize_table_names = false を設定することで無効化できる
- とりあえずモデル名に対応するテーブル名が知りたい!
- > cd RAILS_ROOT
- > ruby script/console
- >> "モデル名".underscore.pluralize
- リクエストとコントローラのマッピングを変更したい!
- RAILS_ROOT/config/routes.rb を変更する
- map.connect ':controller/:action/:id'
- RAILS_ROOT/config/routes.rb を変更する
おまけ
初めての Ruby on Rails
- > cd ドキュメントルート
- > rails プロジェクト名
- > cd プロジェクト名
- > ruby script/generate controller コントローラ名
- > vi app/controllers/コントローラ名.rb
- アクションをメソッドとして実装する
- > vi app/views/コントローラ名/アクション名.rhtml
- アクションに対応するビューを実装する
- > ruby script/server
- > curl http://localhost:3000/コントローラ名/アクション名
初めての Migration
- > mysql -u root -p
- mysql> create database プロジェクト名_development;
- mysql> exit;
- > cd ドキュメントルート/プロジェクト名
- > ruby script/generate model モデル名(単数形)
- > vi db/migrate/001_create_モデル名(複数形).rb
- テーブル定義を実装する
- > rake db:migrate
- > mysql -u root -p プロジェクト名_development
- mysql> show tables;
- mysql> desc テーブル名;
初めての Scaffold
- > cd ドキュメントルート/プロジェクト名
- > ruby script/generate scaffold モデル名(単数形)
- > ruby script/server
- > curl http://localhost:3000/モデル名(複数形)
初めての Rails2.0
- > ruby script/generate scaffold person name:string age:integer
未整理情報
リンクとアクション
- Railsにおけるリンク
- アクションへのリンク
- <%= link_to "リンク文字列", :action=>"アクション名" %>
- <%= link_to "リンク文字列", :controller=>"コントローラ名", :action=>"アクション名" %>
- <%= link_to "リンク文字列", :controller=>"コントローラ名", :action=>"アクション名", :変数名=>値 %>
- <%= link_to "Ruby on Rails", "http://www.rubyonrails.org/" %>
- アクションへのリンク
- リダイレクト
- redirect_to :action=>"アクション名"
- index
- アクション名を省略した場合は、indexアクションが呼ばれる
Railsとデータベース
- Railsでは、ActiveRecordがO/Rマッパーの役割を担う
- Railsの実行モードについて
- Railsアプリケーションは、以下の3つの実行モードを持つ
- 開発環境 (development)
- テスト環境 (test)
- 本番環境 (production)
- 実行モード毎に、使用するデータベースを指定可能
- Railsアプリケーションは、以下の3つの実行モードを持つ
- DB設定
- RAILS_ROOT/config/database.yml
- モデル
- 1モデルオブジェクト = 1テーブルの1レコード
- ActiveRecordと命名規則
- モデル名をアンダースコア化し、複数形したものをテーブル名とする
- アンダースコア化
- RailsPlatform -> rails_platform
- YAML -> yaml
- YAMLData -> yaml_data
- 複数形化
- table -> tables
- person -> people
- メソッド
- ActiveSupportのunderscoreメソッドで、アンダースコア化
- ActiveSupportのpluralizeメソッドで、複数形化
- アンダースコア化
- 主キー
- フィールド名がid
- 数値型フィールドかつオートナンバー型フィールド
- モデル名をアンダースコア化し、複数形したものをテーブル名とする
マイグレーション
- ActiveRecord用の主キー(idフィールド)は、指定しなくても自動的に生成される
- schema_infoテーブルにバージョン番号が格納されている
- > rake db:migrate VERSION=バージョン番号
- schema_infoテーブルは、初回のマイグレーション実行時に自動生成される
コントローラからのモデル操作
- 新規レコードを作成する
- val = ModelClass.new
- 既存レコードを選択する
- val = ModelClass.find(検索内容)
- val = ModelClass.find(1)
- val = ModelClass.find(:all)
- val = ModelClass.find(:all, :conditions => "hoge=10")
- val = ModelClass.find_by_カラム名(カラムの値)
- 既存レコードを更新する
- val = ModelClass.update(更新対象, 更新内容)
- 既存レコードを削除する
- ModelClass.delete(削除対象)
- ModelClass.destroy(削除対象)
- リレーションやコールバックを考慮する場合は、destroyを使う
- Railsでのトランザクション
- ActiveRecordのtransactionメソッドを利用して実現
- Store.transaction do Store.delete_all Page.delete_all end
- transactionを実行するモデルクラス名は、特にどのモデルクラスを選んでも実行結果に違いはありません
レイアウト
- レイアウトとは
- コントローラが管理する全てのビューで共通したHTMLコードを記述するファイル
- レイアウトファイル中のyieldメソッドの部分にビューの内容が代入される
- render :action => '....'
- アクションのビューテンプレートを使って画面表示
モデルでのリレーション設定
- モデルでのリレーション設定
- モデルファイルに、そのモデル自身の位置付けを明記することでリレーションを設定する
- リレーション表現の規約
- 外部キー
- 関連名_id形式のフィールド名にする
- 外部キーは、従属側テーブルに定義される
- 1対1の場合
- has_one :model_a、belogs_to :model_b
- 1対多の場合
- has_many :model_as、belogs_to :model_b
- 「has_many :複数形」とする
- 外部キー
バリデーションの実装方法
- バリデーション
- モデルクラスに、専用メソッドを用いて定義
- "validates_"で始まるメソッド名
- validates_uniqueness_of(:name, :message => "は重複しています")
- カスタム検証
- def validete 検証したい内容 end
フィルター
- before_filter
- before_filter :メソッド名
- フィルタに設定されたメソッドが戻り値としてfalseを返した場合、コントローラに要求されたアクションは実行されない
- フィルタとなるメソッドは、アクションとして呼び出されることがないようにプライベートメソッドとして定義する
- after_filter
- コントローラで指定アクション実行後、ブラウザにレスポンスを返す直前に処理されるフィルタ
- 戻り値は特に影響しない
- around_filter
コールバック
- コールバック
- before_イベント名
- after_イベント名
- イベント名
- save
- create
- update
- destroy
- validation
- validation_on_create
- validation_on_update
- after_find
- after_initialize
- コールバックの使い方
- イベント発生時に実行するメソッドを指定する方法
- フィルタと同じ指定方法
- 直接コールバック名と同じメソッドをモデルに定義する
- def before_save 等、メソッドをオーバーライドする
- selfを使おうね♪
- イベント発生時に実行するメソッドを指定する方法
プラグインの構造
- vendor/plugins ディレクトリ以下に、Railsの規約で定められている構造で配置する


Keyword(s):[Ruby] [Rails] [まとめ]
References: