ユーザ用ツール

サイト用ツール


rails

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
1)
どーせ高価なロードバランサ買うカネなんてありませんよ!
rails.txt · 最終更新: 2023/08/26 04:14 by nullpon