Ruby on Rails チュートリアルをやってみる:[第2章]謎のデモアプリケーション作成編
第2章
デモアプリケーション
前回に続きチュートリアルを進めていきます!railstutorial.jp
この章では、Railsの強力な機能をいくつか紹介するためにデモアプリケーションをつくっていきます。
scaffoldジュネレータというコードを自動生成するスクリプトを使います。
初心者には自動生成するものを使っても理解するのに時間がかかってしまうためこのチュートリアルでは極力触れない方針らしいのですが、この章で形だけでも最初に見ておこうという考えのようです。
では第2章始めましょう!
アプリの計画
はじめに、railsコマンドでアプリケーションの骨格を生成します。
$ cd rails_projects $ rails new demo_app $ cd demo_app
次に、Gemfileを以下のように編集します。前回と同じ内容です。
でもってインストール
$ bundle install --without production $ bundle update $ bundle install
最後にバージョン管理下におきます。
Gitのリポジトリを初期化して最初のコミットを実行。
$ git init $ git add . $ git commit -m "Initial commit"
必須ではないがGitHubにプッシュすることもできます。
以上で下準備は終わりです。第1章の復習と言った感じですね。ここからが本題です。
今回のデモアプリケーションでは、ユーザーと短いマイクロポストのみをサポートするマイクロブログを作成します。
まずはモデルを作成していきます。
・ユーザーのモデル設計
アプリケーションを使うユーザー情報を考えます。
今回はユーザーのモデルを最小限に抑え、
id:integer
name:string
email:string
という概要にします。
・マイクロポストのモデル設計
ユーザーの投稿、いわゆるつぶやきの情報を考えます。
ここではさらにシンプルに
id:integer
content:string
user_id:integer
とします。
Usersリソース
以上のモデルを表示するために実装していきます。この章では全てのRailsプロジェクトに標準装備されているscaffoldジュネレータでUsersリソースを生成します。
Railsのscaffoldは、rails generateスクリプトにscaffoldコマンドを渡すことで生成されます。scaffoldコマンドの引数には、リソース名を単数形にしたもの (この場合はUser) を使用し、必要に応じてデータモデルの属性をオプションとしてパラメータに追加します。
$ rails generate scaffold User name:string email:string
name:stringとemail:stringオプションを追加することで、上記のUserモデルを生成しました。idパラメータはRailsによって自動的に主キーとして追加されています。
続いて以下のようにRakeを使用してデータベースをマイグレートする必要があります。
$ bundle exec rake db:migrate
このコマンドは、単にデータベースを更新し、usersデータモデルを作成するためのものです。
ちなみに、bundle execはRVMを使用している場合は省略可能です。
ここまで実行すればローカルWebサーバを起動できます。
$ rails server
http://localhost:3000/でアクセス。
また、前回と同じようなデフォルトのRailsページが表示されます。
しかし、既にさまざまなページが作成されており、例えば/usersを表示すればユーザー一覧が、/users/newを表示すると新規ユーザー作成ページが作成されています。
正直意味が分かんないです。
でもここは理解しようとするのではなくただそういうものだと思いましょう。
これを自分の手でつくりながら紐解いて行くというのがこのチュートリアルの全てです。
では順を追ってユーザーページを見ていきます。
まずはindexページです。(/users)
まだ誰も登録されていません。
ユーザーを新規登録するためにnewページ(/users/new)を表示します。適当にユーザーを作成します。
ここでURLが/users/1と表示されています。この数字はユーザーのid属性です。
今度は、editページ(/users/1/edit)を表示します。
ユーザーの情報を変更することができます。
ここでnewページ(/users/new)
に戻り、ユーザをもう1人作成します。
indexページ(/users)
を表示してみると、ユーザーが追加されているのが分かります。
最後にユーザーを削除してみます。
これで一通りUsersリソースの概略の説明は終わりです。
一通り触ってみてscaffoldで作成したUsersリソースは便利だと感じたかも知れませんが、欠点がいくつか挙げられます。データの検証が行われていないためユーザー名が空欄や架空のメールアドレスでも通る、ユーザー認証が行われていないため誰でも好きなユーザーを編集・削除できる、レイアウトが整えられていないためサイトデザインも操作法も一貫していないなどです。
Micropostsリソース
同じようにMicropostsリソースもやってみましょう。
$ rails generate scaffold Micropost content:string user_id:integer
新しいデータモデルでデータベースを更新するには、同様にマイグレーションを実行します。
$ bundle exec rake db:migrate
サーバを起動し、同じくアクセスしてみます。
$ rails server
まずは/microposts/newページを開きいくつか作成します。
このうち1つは先ほど作成したユーザーのidと同じにしておきます。
では、ユーザーとマイクロポストを関連づけていきます。
UserモデルとMicropostモデルをそれぞれ以下のように更新することで関連付けを表現できます。(ついでにMicropostに140字制限もつけてます)
app/models/user.rb
class User < ActiveRecord::Base has_many :microposts end
app/models/micropost.rb
class Micropost < ActiveRecord::Base belongs_to :user validates :content, length: { maximum: 140 } end
これで関連付けは完了です。この章では確認はRailsのconsoleを使用して行います。まず、ターミナルでrails consoleコマンドを入力します。User.firstを使用してデータベースから1人目のユーザーの情報を取り出し、first_user.micropostsというコードを実行することでそのユーザーに関連付けられているマイクロポストにアクセスできます。
$ rails console Loading development environment (Rails 4.0.5) 2.0.0-p643 :001 > first_user = User.first User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 => #<User id: 1, name: "まりの", email: "marino@example.com", created_at: "2015-06-15 15:44:46", updated_at: "2015-06-15 15:44:46"> 2.0.0-p643 :002 > first_user.microposts Micropost Load (2.9ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? [["user_id", 1]] => #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, content: "なう", user_id: 1, created_at: "2015-06-15 16:14:10", updated_at: "2015-06-15 16:14:10">]> 2.0.0-p643 :003 > exit
以上でこの章のアプリケーション作成は終わりになります。
最後にリポジトリをGitHubに登録します。
$ git add . $ git commit -m "Finish demo app" $ git push
できればこまめにコミットした方がいいです。
ついでにHerokuにデプロイするならば
$ heroku create $ git push heroku master
アプリケーションのデータベースが動作するようにするには、本番データベースのマイグレーションを行う必要があります。
$ heroku run rake db:migrate
デプロイしても前回同様にRailsのデフォルト画面なのでエラーが出るはずです。
この章でデモアプリケーションを作成しました。が、多くの良い点、課題がありました。この良い点を保ちつつ課題を直していくというのが次章からの流れになっていくようです。
2章終わり