訳あって Ruby on Rails のお勉強を始めることになった。せっかくなので、その日学習したことをまとめていくことにする。
前提
- Ruby 歴: 0秒
- 開発環境: Mac (Mountain Lion)
- MySQL は MAMP のを使用
環境構築
まずはお約束の環境構築から。
Mac に標準で入っている Ruby はバージョンが古くなっている。
$ which ruby
/usr/bin/ruby
$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
ということで rbenv で新しいバージョンのもの (今回は 1.9.3-p429) を入れる。下記の記事そのまんまでできる。
- Linux に Ruby on Rails をインストールする – tsuchikazu blog
ちなみに rbenv とは Ruby のバージョンを簡単に切り換えできるツールで、Perl でいう Perlbrew みたいなものらしい。似たようなので rvm というのもあるが、なんとなく rbenv の方が良さそうなのでこっちを使う。
うまくインストールできたか確認する。
$ which ruby
/Users/sho/.rbenv/shims/ruby
$ ruby -v
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin12.3.0]
続いて Rails (3 系の最新版) をインストールする。
$ gem install rails -v '~> 3.0'
$ rails -v
Rails 3.2.13
Ruby のインデント幅は2が標準らしいので、.vimrc でそう設定しておく。
$ vi ~/.vimrc
:
au BufNewFile,BufRead *.rb set nowrap tabstop=2 shiftwidth=2
au BufNewFile,BufRead *.erb set nowrap tabstop=2 shiftwidth=2
アプリケーションの作成
Rails がインストールできたら、rails new コマンドで新しくアプリケーションを作成する。名前は abunaideka とする。
$ rails new abunaideka
Rails には WEBrick という簡易 Web サーバがバンドルされているので、試しに起動してみる。
$ cd abunaideka
$ rails server
下記の URL にアクセスすると、デフォルトのトップページが表示される。
http://localhost:3000/
MySQL の利用
デフォルトでは SQLite を利用するようになっているが、MySQL に変更してみる。MySQL は MAMP のを使う。
Gem で mysql2 をインストールする。
$ gem install mysql2
:
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.
:
mysql.h is missing. please check your installation of mysql and try again.
:
ふえぇ怒られた。mysql.h がないみたいなので、下記の記事を参考にして入れる。
- MAMP 1.9.5 / MySQL 5.5.9 and Ruby mysql2 — Guard’s Blog
$ brew install cmake
$ cd /tmp
$ curl -OL http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.29.tar.gz
$ tar xvzf mysql-5.5.29.tar.gz
$ cd mysql-5.5.29
$ cmake . \
-DMYSQL_UNIX_ADDR=/Applications/MAMP/tmp/mysql/mysql.sock \
-DCMAKE_INSTALL_PREFIX=/Applications/MAMP/Library
$ make -j 3
$ cp -v libmysql/*.dylib /Applications/MAMP/Library/lib
$ mkdir -p /Applications/MAMP/Library/include/mysql
$ cp -v include/*.h /Applications/MAMP/Library/include/mysql
$ install_name_tool \
-change $(pwd)/libmysql/libmysqlclient.18.dylib \
/Applications/MAMP/Library/lib/libmysqlclient.18.dylib \
~/.rbenv/versions/1.9.3-p*/lib/ruby/gems/1.9.1/gems/mysql2-*/lib/mysql2/mysql2.bundle
$ find /Applications/MAMP/Library/lib \
-name 'libmysqlclient*.dylib' \
-exec install_name_tool -id /Applications/MAMP/Library/lib/libmysqlclient.18.dylib {} \;
再チャレンジ。
$ gem install mysql2
Building native extensions. This could take a while...
Successfully installed mysql2-0.3.11
1 gem installed
いけた。
文字化けする場合は my.cnf を用意して文字コードを設定する。
$ cp -v /Applications/MAMP/Library/support-files/my-medium.cnf /Applications/MAMP/db/mysql/my.cnf
$ diff -u /Applications/MAMP/Library/support-files/my-medium.cnf /Applications/MAMP/db/mysql/my.cnf
--- /Applications/MAMP/Library/support-files/my-medium.cnf 2013-01-22 18:52:49.000000000 +0900
+++ /Applications/MAMP/db/mysql/my.cnf 2013-06-13 16:48:14.000000000 +0900
@@ -24,6 +24,7 @@
# The MySQL server
[mysqld]
+character-set-server = utf8
port = 3306
socket = /Applications/MAMP/tmp/mysql/mysql.sock
skip-external-locking
Gemfile を変更し、bundle install する。
$ diff Gemfile.bak Gemfile
8c8
< gem 'sqlite3'
---
> gem 'mysql2'
$ bundle install
DB の設定ファイル (database.yml) を編集する。MySQl の DB やユーザは適当に作成しておく。
$ diff config/database.yml.bak config/database.yml
7,8c7,12
< adapter: sqlite3
< database: db/development.sqlite3
---
> adapter: mysql2
> database: rails
> username: rails
> password: rails
> host: 127.0.0.1
> port: 8889
Scaffolding の利用
MVC をそれぞれ作成して動作を確認するのはすっ飛ばして、Scaffolding で一気に足場を生成する。モデル名は policeman とする。なお、DB のテーブル名は、モデル名を複数形にしたものが自動的に設定される。不可算名詞の場合は単語そのままになり、でたらめな単語だと後ろに “s” が付くようだ。
$ rails generate scaffold policeman \
name:string \
grade_id:integer \
sex:string \
birthday:date \
hometown:string
これにより、主に以下のファイルが生成される。
- コントローラ
- app/controllers/policemen_controller.rb
- ビュー
- app/views/policemen/*.html.erb
- モデル
- app/models/policeman.rb
DB に反映する。
$ rake db:migrate
テーブルが作成されたか確認する。
$ rails dbconsole
mysql> show tables;
+-------------------+
| Tables_in_rails |
+-------------------+
| policemen |
| schema_migrations |
+-------------------+
2 rows in set (0.00 sec)
mysql> desc policemen;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| grade_id | int(11) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| hometown | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
次の URL にアクセスすると、一覧画面や新規登録、編集画面、削除機能が実装されている!
http://localhost:3000/policemen
せっかくなので、「New Policeman」からデータを追加してみる (生年月日欄は今のとこダミーデータ)。
データが追加された。
フォームの変更
Scaffolding で作成されたフォームは、string だと一律テキストフィールドになっている。試しに性別をラジオボタンに変えてみる (integer で持てよというツッコミは受け付けない…)。
$ diff app/views/policemen/_form.html.erb.bak app/views/policemen/_form.html.erb
24c24,25
< <%= f.text_field :sex %>
---
> <label><%= f.radio_button :sex, "男性" %>男性</label>
> <label><%= f.radio_button :sex, "女性" %>女性</label>
再度新規登録画面や編集画面のフォームにアクセスすると、ちゃんとラジオボタンになっていることがわかる。
バリデーションルールの設定
Scaffolding で生成されたコードにバリデーションルールを追加する。
Rails のバリデーションはモデルで、validates メソッドにより設定する。例として name フィールドを入力必須にしてみる。
$ diff -u app/models/policeman.rb.bak app/models/policeman.rb
--- app/models/policeman.rb.bak 2013-06-09 00:59:34.000000000 +0900
+++ app/models/policeman.rb 2013-06-09 01:00:55.000000000 +0900
@@ -1,3 +1,5 @@
class Policeman < ActiveRecord::Base
attr_accessible :birthday, :grade_id, :hometown, :name, :sex
+ validates :name,
+ :presence => true
end
フォームから空のデータを登録しようとすると、エラーが表示される。
この他のバリデーションルールは、下記のページが参考になる。
- 検証 (validation) – Rails ドキュメント
今日はここまで
Rails を使いこなせるようになれば、かなり効率良くアプリケーションを作成できそうな予感がした初日だった。
続いて以下のようなことを学習したいと考えている。ただし2日目の実施は未定。
- そもそも Ruby の構文
- ビューの見映えの変更
- テーブルのアソシエーション
- Heroku での公開
コメント