読者です 読者をやめる 読者になる 読者になる

Rodhos Soft

備忘録を兼ねた技術的なメモです。

チュートリアルをする。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
email 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のユーザを編集する。

これらのリクエストとアクションの関係をつなぐのがルーティング。


チュートリアルMVCの動きを読んだ。

  1. ブラウザがURL「/users」リクエスト発行
  2. RailsでUsersコントローラのindexアクションにルーティング
  3. indexアクションでUserモデルに全ユーザを要求(User.all)
  4. コントローラは取得したユーザ一覧を@usersに保存しindexビューへ渡す
  5. ビューはHTMLを生成しコントローラに渡す
  6. コントローラはブラウザに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