チュートリアルをする。scaffoldを用いたデモアプリ作成
以下、チュートリアルをやってみたログである。railstutorial.jp
アプリを作る。
rails new demo_app
Gemfileの書き換え
source 'https://rubygems.org' ruby '2.0.0' #ruby-gemset=railstutorial_rails_4_0 gem 'rails', '4.0.5' group :development do gem 'sqlite3', '1.3.8' end gem 'sass-rails', '4.0.5' gem 'uglifier', '2.1.1' gem 'coffee-rails', '4.0.1' gem 'jquery-rails', '3.0.4' gem 'turbolinks', '1.1.1' gem 'jbuilder', '1.0.2' group :doc do gem 'sdoc', '0.3.20', require: false end group :production do gem 'pg', '0.15.1' gem 'rails_12factor', '0.0.2' end
Bundlerで更新
bundle install --without production bundle update bundle install
git管理下に
git init git add . git commit -m "Initial commit"
readmeを適当に書き換えて同じくコミット
githubにpush
git remote add origin https://github.com/<username>/demo_app.git git push -u origin master
アプリの設計
twitter的なマイクロポストアプリ
データモデルは
users
id | integer |
name | string |
string |
micropost
id | integer |
content | string |
user_id | integer |
scaffoldで生成する。
Usersの単数形User。idは自動的に主キーとして追加されているので書く必要はない。
rails generate scaffold User name:string email:string
Rakeでデータベースのmigrate
bundle exec rake db:migrate
ローカルサーバで確認
rails server
usersのページができていることを確認。
http://0.0.0.0:3000/users
/usrsで行われるアクションがindexでユーザ一覧を表示する。
/users/1ではshowでid=1のユーザを表示。
/user/newで行われるアクションがnewで新規ユーザを作成する。
/user/1/editで行われるアクションがeditでid=1のユーザを編集する。
これらのリクエストとアクションの関係をつなぐのがルーティング。
- ブラウザがURL「/users」リクエスト発行
- RailsでUsersコントローラのindexアクションにルーティング
- indexアクションでUserモデルに全ユーザを要求(User.all)
- コントローラは取得したユーザ一覧を@usersに保存しindexビューへ渡す
- ビューはHTMLを生成しコントローラに渡す
- コントローラはブラウザにHTMLを渡す
ルーティングの場所はconfig/routes.rb
で指定されている。
Usersコントローラのアクションは
app/controllers/users_controller.rb
で定義されている。
def index @users = User.all end
確かにユーザ一覧をusers変数に入れている。
users_controllerはApplicationControllerの子であり、
UserはActiveRecordの子である。
Usersコントローラがindexアクション後に呼び出すビューは
app/views/users/index.html.erb
同様にMicropostsについても
rails generate scaffold Micropost content:string user_id:integer
データベースmigrate
bundle exec rake db:migrate
ローカルサーバで確認する。
ActiveRecordにおいてMicropostの文字数を制限してみる。
app/models/micropost.rb
class Micropost < ActiveRecord::Base validates :content, length: { maximum: 140 } end
実際に投稿してみて140文字以上でエラーが出ることを確認する。
ユーザが幾つものマイクロポストを持っているという関係を
has_manyで表現する。
app/model/user.rb
class User < ActiveRecord::Base has_many :microposts end
app/model/microposts.rb
class Micropost < ActiveRecord::Base belongs_to :user validates :content, length: { maximum: 140 } end
rails consolで関連付けを確認する。
rails console
一人目のユーザを変数firstに入れる。
first = User.first
出力
User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
firstのmicropostsを表示
first.microposts
出力
Micropost Load (1.1ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? [["user_id", 1]]
終了
exit
gitにコミット
githubにpush
git add . git commit -m "Finish demo app" git push
herokuにデプロイ
heroku create git push heroku master
herokuのデータベースのマイグレーション
heroku run rake db:migrate
少し時間かかるができた。
ブラウザで確認。
heroku open