狛吹リコーダー部  サイトマップ  Login

Ruby on Rails の規約 - まとめ

この文書について

Ruby on Rails の規約をまとめてみるお!

Ruby on Rails

DRY

  • Don't Repeat Yourself
  • 繰り返しは悪

CoC

  • Convention over Configuration
  • 設計より規約

アーキテクチャ

MVC

  • Controller
    • ActionPack/ActionController
  • View
    • ActionPack/ActionView
  • Model
    • ActiveRecord

ファイル構成

  • 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.rbtest/fixtures/people.yml, db/migrate/001_create_people.rb
モデルとテーブルの対応関係PersonクラスPEOPLEテーブル
Personモデルに対してリレーションを設定has_one :personhas_many :people

命名規則に従うためのツール

ある単語の単数形と複数形を確認する

  1. > cd RAILS_ROOT
  2. > ruby script/console
  3. >> puts "person".pluralize
  4. #=> "people"
  5. >> puts "people".singularize
  6. #=> "person"

ラクダ表記(キャメルケース)とアンダースコア表記を変換する

  1. > cd RAILS_ROOT
  2. > ruby script/console
  3. >> puts "recorder_player".camelize
  4. #=> "RecorderPlayer"
  5. > "KomasuiRecorderBu".underscore
  6. # => "komasui_recorder_bu"

数を序数にする

  1. > cd RAILS_ROOT
  2. > ruby script/console
  3. >> puts 1.ordinalize
  4. # => "1st"
  5. >> puts 2.ordinalize
  6. # => "2nd"
  7. >> puts 3.ordinalize
  8. # => "3rd"

規約より設定

  • モデルクラスで管理対象テーブルを指定したい!
    • set_table_name :テーブル名
  • 主キーを変更したい!
    • set_primary_key :カラム名
  • テーブル名の複数形化を無効にしたい!
    • RAILS_ROOT/config/environment.rbに、ActiveRecord::Base.pluralize_table_names = false を設定することで無効化できる
  • とりあえずモデル名に対応するテーブル名が知りたい!
    1. > cd RAILS_ROOT
    2. > ruby script/console
    3. >> "モデル名".underscore.pluralize
  • リクエストとコントローラのマッピングを変更したい!
    • RAILS_ROOT/config/routes.rb を変更する
      • map.connect ':controller/:action/:id'

おまけ

初めての Ruby on Rails

  1. > cd ドキュメントルート
  2. > rails プロジェクト名
  3. > cd プロジェクト名
  4. > ruby script/generate controller コントローラ名
  5. > vi app/controllers/コントローラ名.rb
    • アクションをメソッドとして実装する
  6. > vi app/views/コントローラ名/アクション名.rhtml
    • アクションに対応するビューを実装する
  7. > ruby script/server
  8. > curl http://localhost:3000/コントローラ名/アクション名

初めての Migration

  1. > mysql -u root -p
    1. mysql> create database プロジェクト名_development;
    2. mysql> exit;
  2. > cd ドキュメントルート/プロジェクト名
  3. > ruby script/generate model モデル名(単数形)
  4. > vi db/migrate/001_create_モデル名(複数形).rb
    • テーブル定義を実装する
  5. > rake db:migrate
  6. > mysql -u root -p プロジェクト名_development
    1. mysql> show tables;
    2. mysql> desc テーブル名;

初めての Scaffold

  1. > cd ドキュメントルート/プロジェクト名
  2. > ruby script/generate scaffold モデル名(単数形)
  3. > ruby script/server
  4. > curl http://localhost:3000/モデル名(複数形)

初めての Rails2.0

  1. > 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)
    • 実行モード毎に、使用するデータベースを指定可能
  • 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の規約で定められている構造で配置する
Last modified:2008/09/16 21:59:47
Keyword(s):[Ruby] [Rails] [まとめ]
References: