目次

2009年1月23日金曜日

Ruby on Rails チュートリアル(1) ~Scaffoled未使用!DB作成からViewまで~

今まで本を見ながらやっていた事のおさらいもかねて、チュートリアルを書いてみようと思います。Rails2.0以降、scaffoldが便利すぎて、自分で一からデータベースを作って呼び出すということを詳細に書いてあるチュートリアルがない!
と苦悩しました。
いろいろなblogを参考にしながら私もひとつ書いてみようじゃないか、と思った次第であります。

今回作るのはこんなもの。


メンバーの一覧が出て来て、名前をクリックすると詳細ページに飛べるってものです。デザインもへったくれもありませんが、これを作って行きましょう。
test002というプロジェクトを作って、対応するDBもつくって、、、、って感じですね。

<1>プロジェクトを作る。
$ rails -d mysql test002
いつもと同じく、です。-d mysqlはrails 2.0以上からはデフォルトDBがsqliteになってしまっているため、忘れずに行いましょう。mysqlで作っている理由は「慣れ」です(笑)

<2>DBを作る。
$ mysql -u root
mysql> create database test002_development;
mysql> create database test002_test;
DB完成。
mysql> exit
mysqlパートは終了です。

<3>モデルを作る。(Userモデルを作ります)
<1>で作ったプロジェクトのディレクトリに移動。
$ cd test002
$ ruby script/generate model user
これでdb>migrateの中にXXXXXXXX(作成日)_create_users.rbというファイルが出来ます。
usersと複数形になるのは仕様です。このusersというのがテーブルの名前になります。

<4>マイグレーション
テーブルの中身"フィールド"というものを作ります。
先ほど作ったモデル「XXXXXXXX(作成日)_create_users.rb」をエディタでOPEN。



class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column :user_name, :string, # 名前(姓)
:null => false
t.column :listening_song, :string # 聴いている曲
t.column :message, :text # 備考
t.column :created_at, :datetime # 登録日時
t.column :updated_at, :datetime # 更新日時

t.timestamps
end
end

def self.down
drop_table :users
end
end



今回は私が作っているMuliusの仕様に合わせて、名前と聴いている曲などのフィールドを足しました。お好みで!
:null => false
これが書いてあるフィールドは、そのフィールドが埋まっていないとエラーが出ます。注意!

<5>マイグレーション
では作ったフィールドをmysqlのDBに取り込みましょう。
$ rake db:migrate

下の結果が出れば、成功。


(in /Users/suzukiyasuko/rails/test002)
== CreateUsers: migrating ====================================================
-- create_table(:users)
-> 0.0048s
== CreateUsers: migrated (0.0053s) ===========================================


エラーが出ないのに、この結果がでない場合、すでに一度マイグレーションしていると思われます。もう一回フィールドを作り直したい場合については次回のblogでまとめておきます。どうしてもって、いう場合は、mysqlでDBを破棄して、<5>をやり直してください。
成功しているか気になる人は、mysqlで
mysql> use test002_development;

mysql> desc users;


+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_name | varchar(255) | NO | | NULL | |
| listening_song | varchar(255) | YES | | NULL | |
| message | text | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)


こんな風に表示されれば大丈夫!

<6>フィクスチャファイルを作る
テーブルと、その中身フィールドを作ってもデータが入っていないのでからっぽです。
フィクスチャファイルを使って、仮のデータを入れてみましょう。
テストを開始するためのソフトウェアの初期状態=フィクスチャらしいです。
まあ、テストのための仮のデータとでも思ってください。
dbフォルダの下にfixturesフォルダを作りましょう。この中に、さらにdevelopmentというフォルダと、productionというフォルダを作ります。developmentフォルダの中に「users.yml」(テーブル名.yml)というファイルを作ります。


# 開発環境のためのフィクスチャ: users
John:
id: 1
user_name: ジョンレノン
listening_song: 赤いスイートピー
message: 松田聖子イイ!!
created_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
updated_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>

Yauko:
id: 2
user_name: 鈴木泰子
listening_song: 木綿のハンカチーフ
message: 古い曲ばっかりだな
created_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
updated_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>



先ほど作ったテーブルの中身と違いの内容に注意。とくにnull =>falseの指定をしたものは、忘れずに書きましょう。

<7>データ投入
ここでちょっと飛び道具。rakeタスクを使って、データを取り込んじゃいましょう。
lib>tasksフォルダの中に、data_loading.rakeというタスクファイルを作ります。本に乗っていたものをそのまま作っちゃいます。


require 'active_record'
require 'active_record/fixtures'
namespace :db do
def load_data(env)
ActiveRecord::Base.establish_connection(env)
pattern = File.join(RAILS_ROOT, 'db', 'fixtures',
env.to_s, '*.{yml,csv}')
Dir.glob(pattern).each do |fixture_file|
table_name = File.basename(fixture_file, '.*')
Fixtures.create_fixtures('db/fixtures/' + env.to_s, table_name)
end
end

namespace :import do
desc "Load fixture data into the development database."
task :development => :environment do
load_data :development
end

desc "Load fixture data into the production database."
task :production => :environment do
load_data :production
end
end
end


完成したら
$ rake db:import:development
これでようやくDBにデータが投入出来ました。

<8>ビューとコントローラーを作る
$ ruby script/generate controller users index show
これでcontrokkerフォルダの中にはusers_controller.rbが出来ます。
viewフォルダの中にindex.rhtml.erbとshow.rhtml.erbも出来ています。
まずはusers_controller.rbの編集。


class UsersController < ApplicationController
def index
@users = User.find(:all)
end

def show
@user = User.find(params[:id])
end

end


次にindex.rhtml.erb


<% @users.each do |user| -%>
<li>
<%= link_to(h(user.user_name), :action => 'show', :id => user.id)%>
</li>
<% end -%>



さらに、show.rhtml.erb



<p>名前は:<%=@user.user_name%></p>
<p>聴いている曲は:<%=@user.listening_song %></p>
<p>メッセージ:<%=@user.message%></p>

<%= link_to '一覧表示に戻る', :action => 'index'%>



これで完成!
$ ruby script/server
さっそくブラウザで見てみましょう。
このチュートリアルが終わった後、もう一度こんどは
テーブルの名前やフィールドを自分で考えたもの、Viewで表示するフィールドを変えてみるなど、一から自分で作ってみると、Railsへの理解を深めることが出来ると思います。

大変おつかれさまでした!

2 件のコメント:

匿名 さんのコメント...

rake db:migrate
のところでエラーが出てrakeの動作自体が終わってしまいます。なぜなんでしょうか。

7kamura さんのコメント...

学生でRailsを勉強中の者です。scaffoldを使わずに解説しているサイトが稀なのですごく重宝しています。
やはり実際に自分で工程を踏まないと理解できませんよね。

私もmigrateのところでエラーが出ましたが、自分の場合は単にテーブル名に沿ったデータベースがmysqlに存在していないだけでした。