備忘録のため,内容の正当性については責任を持ちません。

訳あって 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) を入れる。下記の記事そのまんまでできる。

ちなみに 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 がないみたいなので、下記の記事を参考にして入れる。

$ 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

フォームから空のデータを登録しようとすると、エラーが表示される。

バリデーションエラー

バリデーションエラー

この他のバリデーションルールは、下記のページが参考になる。

今日はここまで

Rails を使いこなせるようになれば、かなり効率良くアプリケーションを作成できそうな予感がした初日だった。

続いて以下のようなことを学習したいと考えている。ただし2日目の実施は未定。

  • そもそも Ruby の構文
  • ビューの見映えの変更
  • テーブルのアソシエーション
  • Heroku での公開

コメント

コメントする




CAPTCHA