こんにちは、のまち(@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アプリの記事でした。