Railsチュートリアルを最後まで。第2章 scaffoldでtoyアプリ

スポンサーリンク
スポンサーリンク
プログラミング

こんにちは、のまち(@bokunomad)です。

Railsチュートリアルの第2章です。自動生成ができる「scaffold」を使って簡単なアプリを作っていきます。

とは言ってもユーザー登録アプリをガッツリ作るというわけではなく、あくまでUserモデルとMicropostモデルの関連付けについて触りをなぞるぐらいです。

ただあとに繋がっていく重要なポイントでもあるので意味を理解して進める必要があります。

Contents

スポンサーリンク
スポンサーリンク

2.1 アプリケーションの計画

まずは新規で「toy_app」を作成して、cdで移動します。ちなみに私はenvironment下に_rails_tutorialフォルダを作ってその下にtoy_appを作成しました。

cd ~/environment
rails new toy_app
cd toy_app/

Toy_appのgemfileを編集してからbundle installします。

source 'https://rubygems.org'

gem 'rails',        '5.1.4'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :production do
  gem 'pg', '0.20.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
bundle install --without production

ここで一旦コミットしてプッシュしておきます。

git init
git add -A
git commit -m "Initialize repository"

git remote add origin git@bitbucket.org:<username>/toy_app.git
git push -u origin --all

続いて1章のときと同じようにhelloアクションをApplicationコントローラーに追加します。さらにルートルーティングも設定します。

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end
Rails.application.routes.draw do
  root 'application#hello'
end

コミットしてHerokuにプッシュします。

git commit -am "Add hello"
heroku create
git push heroku master

2.2 Usersリソース

scaffoldコマンドでUserモデルを作成。さらにマイグレートも行います。

rails generate scaffold User name:string email:string
<略>
rails db:migrate

2.2.1 ユーザーページを探検する

index, show, new, editアクションがscaffoldによって作成されました。これによりURLに/usersや/users/1などを入れると、それぞれのURLに合うアクションが実行されるようになりました。

2.2.2 MVCの挙動

ルートをapplication#helloからusers#indexに変更。またUsersリソース用にアクション割り当てを行います。

resources :リソース名

上記のように記述することでリソース名に対してRESTfulなリソース定義を行ってくれます。つまり「index, create, new ,edit ,show ,update ,destroy」を1つ1つ定義しなくてresourcesで一気に指定することができるというわけです。

Rails.application.routes.draw do
  resources :users
  root 'users#index'
end

2.3 Micropostsリソース

2.3.1 マイクロポストを探検する

Usersリソースと同じようにscaffoldを使ってmicropostモデルを作成。そしてマイグレートする。

rails generate scaffold Micropost content:text user_id:integer
rails db:migrate

resourcesにmicropostsを定義する。

Rails.application.routes.draw do
  resources :microposts
  resources :users
  root 'users#index'
end

2.3.2 マイクロポストをマイクロにする

validationを使って文字数制限を140字にする。

class Micropost < ApplicationRecord
  validates :content, length: { maximum: 140 }
end

2.3.3 ユーザーはたくさんマイクロポストを持っている

ここが今回のキモになるポイントです。操作自体は簡単ですがあとにつながる重要なポイントです。

class User < ApplicationRecord
  has_many :microposts
end
class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }
end

上記2箇所を記述することでUserとMicropostに関連付けされました。

Userには複数のmicropostを属することになるので複数形となります。また1つ1つのMicropostには1人のUserしか属することがないためbelongs_toのUserは単数形で記述します。

これによりMicropostテーブルに含まれているuser_idカラムから、どのUserが作成したmicropostなのかを判別できるようになります。その逆もしかりで、Usersテーブルのidカラムに関連付けられたmicropostを特定することが可能になります。

詳しいことはまた先にやるため今は「関連付けられているんだ」ということだけ認識していれば十分です。

続いてMicropostを作成する際にデータが空白だと投稿できないようにvalidateのpresence :trueを設定します。

class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }, presence: true
end

2.3.5 アプリケーションをデプロイする

コミットしてプッシュします。なるべくこまめに行うようにします。

git status
git add -A
git commit -m "Finish toy app"
git push

さらにHerokuにプッシュします。その後Heroku上のDBを更新するためにマイグレーションを行います。

git push heroku
heroku run rails db:migrate

最後にもう一度Heroku上のアプリを確認して終了です。

まとめ

scaffoldを使うことで手っ取り早くアプリを作ることができました。ただしほんとに雛形レベルなため中身はほぼありません。ここからしっかり機能を実装していく必要があります。

それでは、Railsチュートリアルを最後まで。第2章 scaffoldでtoyアプリの記事でした。