目次
Ruby on Rails
Ruby on Rails (rails) はRubyのWebアプリケーションフレームワーク。URLパスをベースとするディスパッチコントローラ、強力なORマッパ、erbによる画面出力をシームレスに接続する。規約を守る事で開発効率を飛躍的に向上させる「設定より規約(Conversion over Configuration)」という思想を普及させた立役者である。
railsのコンポーネント
rake
Rubyで作られたビルドツール(ruby make?)。railsではrakeコマンドでテスト実行、マイグレーション管理などを行う。使用できるタスクをみるには、railsディレクトリで
$ rake -T
開発環境
実行環境
基本的にpassengerで動作させれば大抵事足りる。外部に公開したいならさくらのvps辺りを借りるのが良いだろう。
手軽に負荷分散を行いたい場合1)は、リバースプロキシとしてApacheを置き、mod_proxy_http + mod_proxy_balancerを使ってロードバランシングするのが簡単。バックエンドのアプリケーションサーバはunicornかapache + passenger、nginx + passengerが良いだろう。
railsの負荷分散する前にボトルネックがどこか調べる。大抵はrailsよりもDBがネックになる。DBが原因なら、DBを別サーバにする。それでもだめならmemcachedにデータをキャッシュ、さらに分散処理を考える。あまり更新されないページについてはキャッシュを使う。
メモリは十分に乗せよう。rails、passengerはメモリ使用量が大きい。
Xenなどの仮想環境での運用には十分な慎重さが求められる。仮想環境ではディスク性能が全体のパフォーマンスに非常に大きな影響を与える。なぜならばCPUはマルチコア化で仮想化に対応しているが、ディスクは一つだからだ。IO負荷があまりに大きいとIO waitが跳ね上がってロードアベレージが100を越える事もあり、ホストOSすらも反応しなくなる。I/Oスケジューラの設定が間違っている事もあるので見直そう。
アプリの負荷分散が必要ならば、nginxをリバースプロキシとしてunicornを並列化すると良い。
ローカルで動かすならばpassengerのスタンドアローンモードでの実行も良いだろう。
Rails 2
Ubuntuにインストール
以下8.04の場合なので、他バージョンでは微妙に必要パッケージや実行コマンドが異なっているが大筋は同じ
# とりあえず最新に sudo aptitude update sudo aptitude safe-upgrade # rubyのインストール sudo aptitude install ruby1.8 sudo aptitude install ruby1.8-dev sudo aptitude install rubygems # MySQLを使うならば sudo aptitude install mysql-server sudo aptitude install mysql-client sudo aptitude install libmysqlclient-dev # Railsをインストール sudo gem update --system sudo gem1.8 install rails # rails 2.3.4を指定してインストールしたいならば sudo gem1.8 install -v=2.3.4 rails # MySQLを使うならば sudo gem1.8 install mysql
アップグレード
Railsのバージョンを上げたい。まず、 config/environment.rb の RAILS_GEM_VERSION を修正。その後
$ rake rails:update
自動生成
railsの各種アプリケーションモジュールはスクリプトで生成する。
scaffoldはモデル、コントローラ、ビュー、テスト、マイグレーションを一度に生成し、URL設定も行う。
script/generate scaffold item name:string price:integer => app/controller/items_controller app/model/item.rb app/view/items/index.html.erb app/view/items/new.html.erb app/view/items/edit.html.erb app/view/items/shot.html.erb db/migrate/xxxxxxxx_create_items.rb
modelはモデルとマイグレーションを作成する
script/generate model item => app/model/item.rb db/migrate/xxxxxxxx_create_items.rb
controllerを作成する
script/generate controller cart => app/controller/cart_controller
マイグレーション(DB定義の管理)を作成する
script/generate migration add_grade_on_items => db/migrate/xxxxxxxx_add_grade_on_items.rb
マイグレーションは命名規則を考えておくと良い。(例:add_grade_on_items ならば items テーブルに grade カラムを追加する)
削除するときは destroy
script/destroy model item
Rails 3
Ruby on Rails 3に関する情報
インストール
- ruby 1.8.7 以降、あるいは ruby 1.9.2 以降をインストールする。
- rubygemsをインストールする。
Railsとbundlerをインストールする。
$ gem install rails $ gem install bundler
他の依存gemはbundlerで一括してインストールできるので、railsとbundlerのみをインストール。
アプリケーション作成
新しいrailsアプリの作成
$ rails new application_name
データベースの種類を指定
$ rails new application_name -d mysql
JavaScriptライブラリを入れない(標準のprototype.jsベースのライブラリではなく、jquery-ujsというjQueryベースのライブラリを使いたい場合)
$ rails new application_name -d mysql -J
テストライブラリを入れない(RSpecを使いたい場合)
$ rails new application_name -d mysql -T
データベース作成
config/database.yamlにデータベースの設定を記述(DB作成のため、最初はユーザ名をrootしておく)
DBを作成(test と developmentのDBが作成される)
$ rake db:create
全部作る場合
$ rake db:create:all
productionだけ作る場合
$ rake db:create RAILS_ENV=production
RSpec-railsを使う
Rails3でRSpecを使うには、rspec-rails v2 以降が必要。現時点(2010/09/24)では、v2系列の正式リリース版は無い
Gemfileに以下の記述を追加。
gem 'rspec-rails', '>=2.0.0.beta'
インストール
$ bundle install $ rails generate rspec:install
jQuery-railsを使う
Rails 3.1ではjQuery-railsがデフォルトのため、以下の作業は不要である。
Gemfileに以下の記述を追加
gem 'jquery-rails'
インストール
$ bundle install $ rails generate jquery:install
HTMLで読み込ませる(app/views/layout/application.html.erb の例)
<!DOCTYPE html> <html> <head> <title>Taskcard</title> <%= stylesheet_link_tag :all %> <%= javascript_include_tag :defaults %> <%= javascript_include_tag "jquery.min" %> <%= javascript_include_tag "rails" %> <%= csrf_meta_tag %> </head> <body> <%= yield %> </body> </html>
rails.jsを読み込んでいないとresourcesでPUTやDELETEを実行できないので注意
自動生成
Scaffold
$ rails generate scaffold model_name name:string title:string description:text
Model
$ rails generate model model_name name:string title:string description:text
Controller
$ rails generate controller controller_name [action_name [action_name ... ]]
作成したものを破棄
$ rails destroy scaffold model_name $ rails destroy model controller_name $ rails destroy controller controller_name
開発用サーバ起動
$ rails server $ script/rails server
railsコマンドは script/rails を呼んでいるだけ
railsコマンド
ヘルプ
$ rails help
サブコマンドのヘルプ
$ rails server -h
Gemの管理
Rails3でライブラリを管理する場合、gemコマンドを直接叩くのではなく、bundlerというgemラッパーライブラリを使ったgem管理が推奨されている。
例えばデータベースにmysqlを指定してrailsアプリを作成した場合、mysql2というgemが必要になる。もしmysql2が入ってなければ
$ bundle install
とするとmysql2のgemがインストールされる。
bundleコマンドで管理されるライブラリはGemfileというファイルに記述されている。データベースにmysqlを指定してrailsアプリを作成すると、Gemfileにあらかじめmysql2が記述されているので bundle install で自動的にmysql2がインストールされるという作りになっている。
gem 'rails', '3.0.0' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'mysql2' # rubyist-aasmはgithubのリポジトリにあるのでsourceで指定する。 # またGemの名前とモジュール名が異なっているのでrequireする名前を指定する。 gem 'rubyist-aasm', '2.1.1', :require => 'aasm' # production環境では使わない(このオプションは廃止された、groupで指示する) gem 'ruby-debug', :except => 'production' # development環境で使う group :development do gem 'ruby-debug' end
aasmはrubygems.orgにはなく、gems.github.comにあるので、sourceに追加する。
source 'http://rubygems.org' source 'http://gems.github.com'
sourceを指定せずにgitリポジトリを指定して直接取得できる。gemで公開されていないforkや最新版も取得できる。
gem 'rubyist-aasm', '2.1.1', :require => 'aasm', :git => "git://github.com/rubyist/aasm.git"
bundleでのgemインストール先
Bundler: The best way to manage Ruby applications
$ bundle install
ふつーにgemを使ったときと同じ場所にインストールされる。rootパスワードを聞かれる。MacOSXでは自分のパスワードで良いようだ。
$ bundle install vendor/bundle
とするとインストールディレクトリを指定できる。
なお、一度vendor/bundleにinstallすると.bundle/configというファイルに記録されるので、以降は指定する必要がないらしい。railsを起動する時も、このパスを見に行くようだ。
--- BUNDLE_DISABLE_SHARED_GEMS: "1" BUNDLE_PATH: vendor/bundle
インストール先を見るには
$ bundle show rubyist-aasm