Ruby on Rails: 2009年2月アーカイブ
前回インストールしたさくらインターネットのレンタルサーバの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: 5000production:
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 /myrailsappRewriteRule ^$ 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.htmlErrorDocument 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超簡単にアプリできすぎです。
やっぱりさくらだとちょっと遅いけど、勉強用には十分ですな。