Ruby on Railsの最近のブログ記事

前回インストールしたさくらインターネットのレンタルサーバのRailsで、サンプルアプリのTODOアプリを作ります。

参考:
さくらのレンタルサーバでRuby on Railsをうごかしてみた...らかなり遅いかも...
Ruby on Rails入門2 サンプルアプリを作る

参考サイトはデータベースにmysqlを使っているんだけど、このとおりにやると、Routing Errorが出るみたいです。ほかの人も結構はまってるぽい。
というわけなので、sqliteを使ってしまいます。そしたら簡単。scaffoldで一発だよ。


[Todoプロジェクトの作成]
Railsディレクトリに移動して、railsコマンドでプロジェクトを作成します。

%cd ~/Rails
%rails Todo
create
create app/controllers
...
create log/development.log
create log/test.log

そうすると、Todoディレクトリが作成されプロジェクトができます。
ディレクトリに移動する。
%cd Todo


[rakeコマンドでデータベースの構築]
config/database.ymlを設定して、rakeコマンドを使うと、DBを自動で構築してくれます。
今回は、sqliteを使うので、database.ymlはそのままでOK。
ちなみにdatabase.yamlはこんな感じ。デフォルトのままでいきます。

%less Rails/Todo/config/database.yml
# SQLite version 3.x
# gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000

production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000


rakeコマンドを以下のように打つだけ。
%rake db:create:all
(in /home/XXX/Rails/Todo)

これでTodo用のsqliteのDBがdbディレクトリ内にできます。


[scaffoldでTODOアプリを構築]
scaffoldというのがCRUD(Create - 生成、Read - 表示、Update - 更新、Destroy - 削除)を自動生成してくれます。今回はTodoというモデルを自動で構築してくれました。ここでマイグレーションファイル(db/migrate /001_create_todos.rb)も生成されるので、こいつをDBにmigrateすると、テーブルとレコードができあがります。という説明はこのブログで2回目です。

%ruby script/generate scaffold Todo title:string body:text done:boolean due:datetime
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/todos
exists app/views/layouts/
exists test/functional/
exists test/unit/
exists public/stylesheets/
create app/views/todos/index.html.erb
create app/views/todos/show.html.erb
create app/views/todos/new.html.erb
create app/views/todos/edit.html.erb
create app/views/layouts/todos.html.erb
create public/stylesheets/scaffold.css
create app/controllers/todos_controller.rb
create test/functional/todos_controller_test.rb
create app/helpers/todos_helper.rb
route map.resources :todos
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/todo.rb
create test/unit/todo_test.rb
create test/fixtures/todos.yml
create db/migrate
create db/migrate/20090207005150_create_todos.rb

次にマイグレートする。
%rake db:migrate
(in /home/XXX/Rails/Todo)
== CreateTodos: migrating ====================================================
-- create_table(:todos)
-> 0.0074s
== CreateTodos: migrated (0.0077s) ===========================================

[環境ファイルの設定]
前回同様、environment.rbに以下のパスを追加します。XXXはユーザアカウントね。
RAILS_RELATIVE_URL_ROOTは/todoにしとく。これなくても動くかも。

%vi config/environment.rb
# Be sure to restart your server when you modify this file
$LOAD_PATH.push("/home/XXX/lib/")
$LOAD_PATH.push("/home/XXX/lib/ruby")
ENV['GEM_HOME'] ||= '/home/XXX/lib/ruby/gem'
ENV['RAILS_RELATIVE_URL_ROOT']="/todo"

次に.htaccessも前回同様に。前回のとおりやってる人は、コピーでいい。

%cp ~/Rails/test/public/.htaccess ~/Rails/Todo/public/

一応載せとくと、中身はこんな感じ。
%vi public/.htaccess
# General Apache options
#AddHandler fastcgi-script .fcgi
#AddHandler cgi-script .cgi
#Options +FollowSymLinks +ExecCGI
#AddHandler cgi-script-debug .cgi

# If you don't want Rails to look in certain directories,

# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
RewriteEngine On

# If your Rails application is accessed via an Alias directive,
...
# RewriteBase /myrailsapp

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

# In case Rails experiences terminal errors
...
# ErrorDocument 500 /500.html

ErrorDocument 500 "

Application error

Rails application failed to start p
roperly"

[Webに公開]
最後に、webからみられる場所からTodo/publicに向けてシンボリックリンクを
張ります。
~/wwwの直下に「todo」という名前でシンボリックリンクを作ります。

%ln -s $HOME/Rails/Todo/public/ $HOME/www/todo


完了!
以下にアクセスすると、Todoアプリが動いているはずです。
http://XXX.sakura.ne.jp/todo/todos

こんな感じです。レコードの生成、表示、更新、削除ができるよ。
RoR超簡単にアプリできすぎです。

todo.png

やっぱりさくらだとちょっと遅いけど、勉強用には十分ですな。

Ruby on Railsをさくらインターネットにインストールして実行するまで。
せっかくなので最新版を入れるよ。すごい勢いでつまづきまくったよ。

Ruby on Railsのインストール
参考:
さくらのレンタルサーバーに Ruby on Rails をインストールする手順
さくらのレンタルサーバーにRuby on Rails 2.0.2をインストールする方法

参考サイトどおりにやれば問題ないよ。

%ruby -version ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-freebsd6]
現在のさくらのrubyのバージョンは1.8.6です。


[rubygemsのインストール]
rubygemsの最新版、1.3.1を取得し、インストールします。
インストール先はさくらなので$HOME内です。--prefix=$HOMEを忘れずに。

%mkdir $HOME/src
%cd $HOME/src
%ftp http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
%tar zxf rubygems-1.3.1.tgz
%cd rubygems-1.3.1
%ruby setup.rb --prefix=$HOME
インストール完了

[環境変数の設定]
次に環境変数の設定。

%cd
%vi .cshrc
set path = (~/pear/bin /sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/
X11R6/bin $HOME/bin $HOME/lib/ruby/gem/bin)
setenv RUBYLIB $HOME/lib
setenv GEM_HOME $HOME/lib/ruby/gem
.cshrcのset pathに $HOME/lib/ruby/gem/bin と、RUBYLIBとGEM_HOMEを追加します。
%source $HOME/.cshrc
%rehash
%gem18 --version
1.3.1
sourceで記載したパスを今すぐ通す。通したパス内の実行可能ファイルをすぐ反映させるためrehash。


Railsのインストール

%gem18 install rails
これで5分くらい待つとインストール完了。すごい簡単。
%rehash
%rails --version
Rails 2.2.2
rehashしてバージョンを調べたら、ちゃんと2.2.2が入っていた。完璧。


Railsを動かす
参考:
さくらのレンタルサーバにRuby on Railsをインストールする方法 その2


ここからが地獄の始まりでしたよ。超参考になるかもしれない。
基本、上記参考サイトの通りに進めます。

Railsのアプリケーションのディレクトリを作成。
そして、testというアプリケーションを作成。

%cd
%mkdir Rails
%cd Rails
%rails test

次にパーミッションを変更します。
logとtmpディレクトリに書き込み権限を付加。

%cd test
% chmod -R o+w log tmp
% ls -l

次に環境ファイルの設定です。
test/config/environment.rbが環境ファイル。
この設定、RUBYLIBの場所が変わってるから、
$LOAD_PATH.push("/home/XXX/lib/")としないといけません。注意。
これちゃんとしないと「Rails application failed to start properly」の
エラーが出ます。

%vi config/environment.rb
# Be sure to restart your server when you modify this file
# 以下を追加(XXXはユーザ名に置き換えてね)
$LOAD_PATH.push("/home/XXX/lib/")
$LOAD_PATH.push("/home/XXX/lib/ruby")
ENV['GEM_HOME'] ||= '/home/XXX/lib/ruby/gem'
ENV['RAILS_RELATIVE_URL_ROOT']="/test"

それから、ENV['RAILS_RELATIVE_URL_ROOT']="/test"は、
routing error が出る場合の対策。
これがないと「routing error No route matches "/test/rails/info/properties"」とか出る。調べてみると

http://groups.google.co.jp/group/rubyonrails-core/browse_thread/thread/da88f067f38e76ca?pli=1
The change in relative_url_root behavior was necessary for thread-safety. Passenger needs to be updated.
In the mean time, you can do it yourself by manually setting relative_url_root in your environment.rb.
どうも、Rails2.2になって、挙動が変わったために手動で設定が必要らしい。
ここ、かなり悩んだ。気をつけて!><


次に、public/.htaccessの設定。
しかし、.htaccessは作成されてなかった。バージョンの違い?
手動で作ります。サンプルがREADMEの中にあるので、それをコピペして、
AddHandlerとOptionsをコメントアウトします。

%vi public/.htaccess
# General Apache options
#AddHandler fastcgi-script .fcgi
#AddHandler cgi-script .cgi
#Options +FollowSymLinks +ExecCGI

# If you don't want Rails to look in certain directories,
# use the following rewrite rules so that Apache won't rewrite certain requests
#
# Example:
# RewriteCond %{REQUEST_URI} ^/notrails.*
# RewriteRule .* - [L]

# Redirect all requests not available on the filesystem to Rails
# By default the cgi dispatcher is used which is very slow
#
# For better performance replace the dispatcher with the fastcgi one
#
# Example:
# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
RewriteEngine On

# If your Rails application is accessed via an Alias directive,
# then you MUST also set the RewriteBase in this htaccess file.
#
# Example:
# Alias /myrailsapp /path/to/myrailsapp/public
# RewriteBase /myrailsapp

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

# In case Rails experiences terminal errors
# Instead of displaying this message you can supply a file here which will be re
ndered instead
#
# Example:
# ErrorDocument 500 /500.html

ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"

長いけどこんな感じ。
これもファイルがなくて悩んだので全部載せときます。


次。webからみられる場所からtest/publicに向けてシンボリックリンクを
張ります。
~/wwwの直下に「test」という名前でシンボリックリンクを作ります。

% ln -s $HOME/Rails/test/public $HOME/www/test

これで、http://XXX.sakura.ne.jp/test/にアクセスすると、
「Welcome aboard」のページが表示されます。
ここの「About your application's environment」をクリックしてみてください。

  • Application error "Rails application failed to start properly"が出る ⇒config/environment.rbの設定が間違ってる可能性があります。
     パスを再確認してください。
  • Routing error "No route matches "/test/rails/info/properties" with {:method=>:get}"が出る
    ⇒config/environment.rbに
     ENV\['RAILS_RELATIVE_URL_ROOT'\]="/test"を追加してください。
     もしくは、public/.htaccessのRewriteの設定が間違ってる可能性アリ
  • For security purposes, this information is only available to local requests.と出る
    ⇒おめでとうございます。成功しました。これで終わりです。
  • no such file to load -- sqlite3というエラーが出る
    ⇒以下に進んでください

僕はここで、no such file to load -- sqlite3というエラーが出ました。
これは、sqlite3-rubyが入ってないせいです。入れます。

%setenv RB_USER_INSTALL true
%gem18 install sqlite3-ruby
setenvでRB_USER_INSTALLをtrueにしてるのはどういうことかというと、
普通にgemでインストールしようとすると、エラーが出ます。
こんなの。
chown/chgrp: Operation not permitted
探したら、こんなのを見つけた。
http://blog.proj.jp/ituki/20090107.html
/usr/local/lib/ruby/1.8/i386-freebsd6/rbconfig.rb を見ると
> CONFIG["INSTALL"] = ENV['RB_USER_INSTALL'] ? '/usr/bin/install -c' : '/usr/bin/install -c -o root -g wheel'
とかいう記述がある
よって
setenv RB_USER_INSTALL true
とかコマンドラインで入力してから rubugemsをインストールすればいい
というわけです。

ちなみに、手動でsqlite3-ruby入れようと試すとこんな感じ。失敗します。

%wget http://rubyforge.org/frs/download.php/42056/sqlite3-ruby-1.2.4.tar.gz
%tar zxf sqlite3-ruby-1.2.4.tar.gz
%cd sqlite3-ruby-1.2.4
%ruby setup.rb config --prefix=$HOME -- --with-sqlite3-dir=$HOME
%ruby setup.rb setup
%ruby setup.rb install
しかし、ここではこんなエラーが出たので、オススメできない。
don't know how to make ruby.h. Stop

以上、奮闘しましたが、無事「For security purposes, this information is only available to local requests.」が見えるのではないでしょうか。
実は僕は、なぜかばっちりRuby versionとかが出ちゃってますが。
まあ動いているのでよしとする。次回はサンプルアプリに挑戦します。


今回は、アプリを作ってみるよ!
前回、めんどくさそうなので、と言ったのは、masuidrive on rails » Blog Archive » PHPユーザの為のRuby/Rails入門 の「Railsチュートリアル」に従って試してみたけどエラーが出て動かなかった><

Todoアプリをチュートリアルどおりに動かしたんです。MySQLもしっかり設定した。
scaffoldやってみると、「wrong number of arguments (1 for 2)」と出て、引数の数がおかしいとか。
実際に動かしてみると、

Routing Error
No route matches "/todo/" with {:method=>:get}

むう。

無知な僕は、色々調べて、ルーティングがおかしそうだなと思い、試してみた。
ルーティングというのは、mod_rewriteみたいな、URLの書き換え機能だそうで、config/routes.rbで定義されてます。色々いじって、別のサイトに載ってるサンプルで試してルーティングの変え方とかわかったんだけど、Todoは動かなかった。

またもや色々調べて、やっと分かった。Railsのバージョンが違うからですな。
最新版のRails2.0.2ではデフォルトのDBがMySQLからSQLite3へ変わっていた。こいつが原因だ!
http://journal.mycom.co.jp/news/2007/12/18/025/index.html

こっからはうまくいった方法。

まず、前回作ったtestアプリケーションは(rails test)一旦忘れて、todoプロジェクトを作成。
その際に、DBをMySQLを指定します。以下のコマンドをコマンドプロンプトで。

>cd c:\RoR_project
>rails -d mysql todo
  create
  create app/controllers
  create app/helpers
  create app/models
  (中略)
  create log/server.log
  create log/production.log
  create log/development.log
  create log/test.log

アプリケーションが作成されて、ディレクトリがいっぱいできます。
次は、データベースの設定です。config/database.ymlを設定します。
中身はこんな感じ。(コメント除く)

development:
 adapter: mysql
 encoding: utf8
 database: todo_development
 username: root
 password:
 host: localhost
test:
 adapter: mysql
 encoding: utf8
 database: todo_test
 username: root
 password:
 host: localhost
production:
 adapter: mysql
 encoding: utf8
 database: todo_production
 username: root
 password:
 host: localhost

Railsでは開発環境・テスト環境・本番環境がそれぞれ用意されているらしい。上のdevelopment、test、productionですね。詳しいことはまだ勉強が必要だけどものすごい便利そう!すごいよ仕事でも使おうよ!って思った。

ここは、passwordを設定してる場合は書いておけばok。インストールしたばかりなら編集なしでok。ほんとはrootは危ない。

次はrakeコマンド。データベースを自動で構築してくれます。

>cd todo
>rake db:create:all
(in C:/RoR_project/todo)

phpMyAdmin(http://localhost/mysql/)でmySQLを確認すると、todo_development、todo_production、todo_testができてるはず。

最後に一気にTODOを構築するコマンドです。

>ruby script/generate scaffold Todo title:string body:text done:boolean due:datetime
  exists app/models/
  exists app/controllers/
  exists app/helpers/
  create app/views/todos
  exists app/views/layouts/
  exists test/functional/
  exists test/unit/
  create app/views/todos/index.html.erb
  create app/views/todos/show.html.erb
  create app/views/todos/new.html.erb
  create app/views/todos/edit.html.erb
  create app/views/layouts/todos.html.erb
  create public/stylesheets/scaffold.css
 dependency model
  exists app/models/
  exists test/unit/
  exists test/fixtures/
  create app/models/todo.rb
  create test/unit/todo_test.rb
  create test/fixtures/todos.yml
  create db/migrate
  create db/migrate/001_create_todos.rb
  create app/controllers/todos_controller.rb
  create test/functional/todos_controller_test.rb
  create app/helpers/todos_helper.rb
   route map.resources :todos

scaffoldというのがCRUD(Create - 生成、Read - 表示、Update - 更新、Destroy - 削除)を自動生成してくれます。今回はTodoというモデルを自動で構築してくれました。ここでマイグレーションファイル(db/migrate/001_create_todos.rb)も生成されるので、こいつをDBにmigrateすると、テーブルとレコードができあがります。

>rake db:migrate
(in C:/RoR_project/todo)
== 1 CreateTodos: migrating ===================================================
-- create_table(:todos)
  -> 0.0620s
== 1 CreateTodos: migrated (0.0620s) ==========================================

最後にWEBサーバを起動して、アプリケーションを実行してみます。

>ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-01-22 01:49:31] INFO WEBrick 1.3.1
[2008-01-22 01:49:31] INFO ruby 1.8.6 (2007-09-24) [i386-mswin32]
[2008-01-22 01:49:31] INFO WEBrick::HTTPServer#start: pid=4628 port=3000

http://localhost:3000/todos/にアクセスしてみると、TODOができてます!
レコードの生成、表示、更新、削除がちゃんとできた!
ちょっとつまづいたけど、簡単にアプリができちゃった。動かない原因調べるのに2時間かかったけど><

Railsの初歩の初歩と仕組みの大枠が理解できたので、今度は本を買ってこつこつやってみるよ。
とりあえずこれ買った。

基礎Ruby on Rails (IMPRESS KISO SERIES)
黒田 努 佐藤 和人

4844324780
インプレスジャパン 2007-10
売り上げランキング : 6837
おすすめ平均 star

1ヶ月くらいでなんか公開できるものを作りたいなあ。

初心にかえって、プログラミングを勉強してみることにしたよ。

最近すごく気になってたRuby on Railsを始めてみます。
とりあえず、はてぶでRuby on Railsタグの人気エントリを探して、勉強するサイトの見当をつける。

見つけたのはここ。
masuidrive on rails » Blog Archive » PHPユーザの為のRuby/Rails入門

PHPは仕事でも触ったことあるので、得意っちゃ得意ということで、高橋メソッドなRubyの資料を読んでお勉強。高橋メソッドってやっぱいいね。モチベーションを下げさせない力があるよ。

Rubyの第一印象。
・全部オブジェクトとか超嬉しい><
・痒いところに手が届いてて嬉しい。最新の言語の利点ってそういうもんなのかな。
・自由度高くて、VBぽくね?綺麗で安全なコードを書くための自分ルールを作るために色々調べないといかんかも。
・オープンクラスとかすげー。でもできること多すぎてふわふわ感。
・イテレータとか、ちょっと新しい書き方の癖つけないといけないな。
・これ使ってから仕事でCとか書きたくなくなっちゃったり(´・ω・`)

Ruby編を読み終え、次は実際にインストールとか必要ぽいので、できそうなところを探してみます。
環境はWindowsですよ。今度はここを参照しました。
Ruby on Rails/インストール for windows

まずは、このPC買ったばかりでMySQLが必要なので、面倒なのでXAMPPで一気に色々インストールしちゃいます。
http://www.apachefriends.org/jp/xampp-windows.html
僕が入れたのは、xampp-win32-1.6.5-installer.exeです。
簡単だね。ApacheもMySQLもインストールできた。PHPならこれで始められるよ。

RubyはOne Click Installerというので、一発で入っちゃうみたいなのでそこからインストールしますよ。
http://rubyforge.org/projects/rubyinstaller/
僕が入れたのは、ruby186-26.exeです。

インストールしたら、Railsをインストール。
コマンドラインで以下を実行とのことです。

gem install rails -y

んーできた。次はC:\RoR_projectというフォルダを作って以下を実行。

cd c:\RoR_project
rails test
ruby test/script/server

で、http://localhost:3000/にアクセス。これで初期画面が見られるみたい。
んー、インストールはなんて簡単なんだろう。

アプリ動かすのは説明が若干ややこしそうなのでもうちょい試してから次回書くよ!

プロフィール

nyontan/nyon2
経営とかプログラミングとかフィリピンとか。基本的にふざけてるけど、たまに超まじめ。
うんこうんこー。

最近読んだ本

早起き生活