【Rails7】Ruby on Rails7のローカル環境構築とScaffoldでのアプリ作成

Ruby on Rails
マイケル
マイケル
みなさんこんにちは!
マイケルです!
エレキベア
エレキベア
こんにちクマ〜〜
マイケル
マイケル
いきなりだけど今日は
Ruby on Rails の環境構築と使い方について見ていくぜ!
エレキベア
エレキベア
Railsクマか〜〜〜
前も少し触ったりしてたクマね
マイケル
マイケル
Unityと絡めて少し触ったことがあったね。
今後仕事でも触る機会が出てきそうだから、これを機に使い方をまとめて
思い出しておこうと思ったんだ!
エレキベア
エレキベア
なるほどクマ
確かにこういうのはまとめておかないとすぐ忘れちゃうクマからね〜〜
マイケル
マイケル
今回の記事では環境構築からScaffold機能を用いたアプリ作成までやっていこうと思うよ!
早速見ていこう!!
スポンサーリンク

Ruby on Railsとは

マイケル
マイケル
Ruby on Railsとは、Rubyで構築されたWebフレームワーク
下記のような特徴があります!
Ruby on Railsとは
  • MVCモデルを採用している
  • CoC(設定より規約)DRY(同じことを繰り返さない)といった設計哲学に基づいている
  • 自動テストを行う文化を尊重している

Ruby on Rails 公式ページ(英語)

マイケル
マイケル
かなりカッチリしたMVCフレームワークで、触っていく内に命名等の規約の厳格さも分かってくると思います。
その分、設計に悩むことが少なくなり開発の効率や可読性も向上する、といったメリットが挙げられます。
マイケル
マイケル
Webアプリはもちろん、モバイルアプリのRESTfulなAPIサーバとしてもよく使用されています。
最近はGoやKotlinの人気が出てきたり、Laravelといったフレームワークも出てきていますが、今でも人気を誇るフレームワークです。
エレキベア
エレキベア
Railsはみんな大好きなイメージクマ〜〜〜〜
マイケル
マイケル
また、Railsガイドやチュートリアルといった日本語のドキュメントが充実しているのも特徴です。
自分もとりあえずチュートリアルは通しでやっておきましたが、無料でこのレベルの教材はすばらしいなと思いました!
無駄に長いですが・・・)

Railsガイド

Ruby on Railsチュートリアル

エレキベア
エレキベア
Rubyの開発者が日本人なだけあって、日本でのフォローは厚そうクマね

Rails環境構築とアプリの雛形作成

マイケル
マイケル
概要について知ったところで早速環境を作ってみましょう!
今回は、2022年11月時点で最新である、Rails7系を使って構築していきます!
OSMac
Ruby3.1.2
Rails7.0.4
マイケル
マイケル
Dockerを使用する方法もありますが、複雑さが増してしまうため
ローカルに環境を構築する方向で進めます。
Dockerを使用したい方は、下記あたりの記事をご参照ください!

ComposeとRails – Docker公式ドキュメント

Rails 7 + MySQLの環境構築をDocker composeで作る

エレキベア
エレキベア
Docker公式の手順はRails5になってるクマね・・・

Rubyのインストール

マイケル
マイケル
まずはRubyをインストールします。
公式ページから直接ダウンロードしてもよいですが、自分の場合はanuenv環境を使用しているため下記のコマンドでインストールしました。
# Rubyインストール
anyenv install rbenv
exec $SHELL -l
rbenv install 3.1.2
rbenv global 3.1.2
exec $SHELL -l
Ruby ダウンロード
↑直接ダウンロードする場合はこちら
エレキベア
エレキベア
env系で管理するのが切り替えが楽でおすすめクマ〜〜〜

Railsのインストール

マイケル
マイケル
次はgemコマンドrailsをインストールします。
gemとはRubyのパッケージのことで、RubyGemsというパッケージ管理システムで管理されています。
通常は下記のようにインストールすることができます。
gem install [package name]
エレキベア
エレキベア
npmやpipと同じ類クマね
マイケル
マイケル
上記のように直接railsを指定してインストールしてもよいのですが、今回はグローバルな環境を汚さないよう、bundlerというパッケージを使用してアプリ配下でのみ必要なgemを指定して使用するようにしてみます。
マイケル
マイケル
bundlerについてはRuby2.5以降はデフォルトで入っているためインストールする必要はないのですが、Rails7のインストール時にはエラーが出てしまうため。下記コマンドでバージョンを最新に上げておきます。
# Rails7環境を作成しようとした際にbundlerのバージョンが古くインストールできないためアップデート
sudo gem update --system
exec $SHELL -l
エレキベア
エレキベア
デフォルトのbundlerのバージョンがちょっと古いのクマね
マイケル
マイケル
アプリ配下でのみ使用したい場合には、Gemfileというファイルを用意して
使用するパッケージとバージョンを指定します。
下記のようにフォルダを作成して bundle init コマンドでGemfileを作成しましょう!
# プロジェクトフォルダ作成
mkdir todo_app_sample
cd todo_app_sample
# Gemfile作成
bundle init
マイケル
マイケル
そして使用するrailsのバージョンを下記のように追加します。
# frozen_string_literal: true
source "https://rubygems.org"
gem 'rails', '~>7.0.1'
↑インストールするRailsを追加
マイケル
マイケル
Rails7.0.0はRuby3系に対応していないようなので、7.0.1以上という形で指定しています。
この状態で bundle install コマンドを実行してgemをインストールしましょう。
この時、指定したパスの中にパッケージがインストールされます。
# Gemfileの内容をvendor/bundle配下にインストール
# この時、Gemfile.lockも作成される
bundle install --path vendor/bundle
# 指定したRailsのバージョンが表示される
bundle exec rails -v
マイケル
マイケル
これでグローバルな環境を汚すことなくプロジェクト配下でのみRails7を使用する準備ができました。
bundle exec ~はbundleでインストールしたライブラリを実行するコマンドです。
Railsのバージョンが7系で表示されていれば成功です!
エレキベア
エレキベア
なるほどクマ
bundleコマンドはgemを使用する範囲を限定してくれる機能なのクマね
マイケル
マイケル
Gemfileや生成されたGemfile.lockを見て判断しているみたいだね
このようにbundleコマンド経由でインストールすると異なるバージョンで複数のアプリを管理することも容易になるよ!

アプリ作成と起動

マイケル
マイケル
準備ができたところでアプリを作成しましょう!
rails new コマンドで雛形を作成することができます!
# 直下にアプリの雛形を作成
# 上書きするか聞かれるが、全てYESにする
# mailer等を作成しない場合は下記を指定
bundle exec rails new .
# サーバ起動
# http://127.0.0.1:3000
bundle exec rails server
マイケル
マイケル
作成が完了したら rails server コマンドでサーバを立ち上げて、
「http://127.0.0.1:3000」を開いてみましょう!
ScreenShot 2022 11 05 17 16 44
マイケル
マイケル
このようにRailsのページが表示されれば完了です!!
エレキベア
エレキベア
やったクマ〜〜〜〜

フォルダ構成を見てみる

マイケル
マイケル
アプリを作成したところで、メインとなるフォルダ構成についても軽く見てみよう!
app
マイケル
マイケル
まずはアプリケーション本体となるappフォルダです!
こちらはメインとなる MVC(models、controllers、views)のコードが格納されてる他、
メール機能(mailers)や、リアルタイム通信(channels)といった機能もデフォルトで格納されています。
app/
├── assets
│   ├── config
│   │   └── manifest.js
│   ├── images
│   └── stylesheets
│       └── application.css
├── channels
│   └── application_cable
│       ├── channel.rb
│       └── connection.rb
├── controllers
│   ├── application_controller.rb
│   └── concerns
├── helpers
│   └── application_helper.rb
├── javascript
│   ├── application.js
│   └── controllers
│       ├── application.js
│       ├── hello_controller.js
│       └── index.js
├── jobs
│   └── application_job.rb
├── mailers
│   └── application_mailer.rb
├── models
│   ├── application_record.rb
│   └── concerns
└── views
    └── layouts
        ├── application.html.erb
        ├── mailer.html.erb
        └── mailer.text.erb
マイケル
マイケル
とはいえ、最初の内は使わない機能も多いと思うので、
そのような時はアプリ作成時に –skip-XXX オプションを付けることで不要な機能の作成をスキップすることができます!
bundle exec rails new . --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-action-cable
↑不要な機能の作成はスキップできる
エレキベア
エレキベア
最初はスキップしておいた方が理解しやすそうクマね
config
マイケル
マイケル
configフォルダの中には、各種設定ファイルが格納されています。
特によく見るのは ルーティング情報が記載されている routes.rb と、DB情報が設定されている database.yml ですね!
config/
├── application.rb
├── boot.rb
├── cable.yml
├── credentials.yml.enc
├── database.yml
├── environment.rb
├── environments
│   ├── development.rb
│   ├── production.rb
│   └── test.rb
├── importmap.rb
├── initializers
│   ├── assets.rb
│   ├── content_security_policy.rb
│   ├── filter_parameter_logging.rb
│   ├── inflections.rb
│   └── permissions_policy.rb
├── locales
│   └── en.yml
├── master.key
├── puma.rb
├── routes.rb
└── storage.yml
マイケル
マイケル
ちなみにデフォルトのDB情報は下記のようにSQLiteが指定されています。
こちらの情報を変更することで MySQL や PostgleSQL といったDBに切り替えることができます。
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
development:
  <<: *default
  database: db/development.sqlite3
test:
  <<: *default
  database: db/test.sqlite3
production:
  <<: *default
  database: db/production.sqlite3
エレキベア
エレキベア
SQLiteはお手軽クマからね〜〜
db
マイケル
マイケル
dbフォルダ内には実際のデータや、テーブル定義、seedデータが格納されます。
初期状態だと特に指定されているものはない状態です。
db/
├── development.sqlite3
└── seeds.rb
エレキベア
エレキベア
この辺りは今後作っていくクマね


Scaffoldでテンプレート作成

マイケル
マイケル
雛形ができたところで、今度はRailsのScaffold機能を用いて
テンプレートを作成してみます!
rails generate scaffold – Railsドキュメント
エレキベア
エレキベア
MVCやルーティングも含めて一気に作成してくれる機能クマね
マイケル
マイケル
実際のアプリ開発ではあまり使うことはないと思うけど、
ざっくりとイメージを掴むのには丁度いいと思うので触ってみましょう!

テンプレート作成

マイケル
マイケル
Scaffoldでテンプレートを作成するには、rails generate scaffoldコマンドを使用します。
今回は content 項目だけを持つ Taskテーブル を定義して作成してみます!
# scaffoldでTaskデータのテンプレートを作成
bundle exec rails generate scaffold Task content:text
マイケル
マイケル
実行すると、MVCのコード含めて様々なファイルが作成されるのが確認できます・・・
エレキベア
エレキベア
何ができたか分からないクマが一気に作ってくれたのだけは分かるクマ〜〜

テーブル作成

マイケル
マイケル
db/migrateフォルダを見てほしいのですが、
下記のようにテーブル定義が記述されたファイルが作成されていることが分かります。
class CreateTasks < ActiveRecord::Migration[7.0]
  def change
    create_table :tasks do |t|
      t.text :content
      t.timestamps
    end
  end
end
マイケル
マイケル
Railsではこのフォルダ内に作成されたマイグレーションファイルを元にテーブルを作成します。
rails db:migrate コマンドを実行し、テーブルを作成しましょう!
# テーブル作成
bundle exec rails db:migrate
エレキベア
エレキベア
この辺はLaravelに似てるクマね〜〜

routesの確認

マイケル
マイケル
そして次はルーティング情報を見てみます。
Config/routes.rb ファイルを見てみると、下記のように「resources :tasks」という形で指定されていることが分かります。
Rails.application.routes.draw do
  resources :tasks
end
マイケル
マイケル
このroutes.rbには基本的に get や post といった一般的なルーティング形式で記述されるのですが、resourcesはリソース操作を行うための複数のルーティングがまとめて指定される形となります。
resources – Railsドキュメント
エレキベア
エレキベア
一覧やデータ作成、更新等がまとめられているのクマね
マイケル
マイケル
実際にどのようなURLになっているのか?については
rails routes コマンドで確認することができます。
#routesの一覧を確認
bundle exec rails routes
    tasks GET    /tasks(.:format)          tasks#index
          POST   /tasks(.:format)          tasks#create
 new_task GET    /tasks/new(.:format)      tasks#new
edit_task GET    /tasks/:id/edit(.:format) tasks#edit
     task GET    /tasks/:id(.:format)      tasks#show
          PATCH  /tasks/:id(.:format)      tasks#update
          PUT    /tasks/:id(.:format)      tasks#update
          DELETE /tasks/:id(.:format)      tasks#destroy
マイケル
マイケル
resources指定だけでこれだけのルーティングがまとめて指定されるわけですね
エレキベア
エレキベア
リソース操作に必要なルーティングが揃っているクマね

起動して確認

マイケル
マイケル
それでは rails server コマンドで起動して
実際に作成されたテンプレートを触ってみましょう!
# サーバー起動
bundle exec rails server
マイケル
マイケル
各URLを指定して開くと、下記のようにデータ作成や表示が行えることが確認できます!
http://127.0.0.1:3000/tasks/new
ScreenShot 2022 11 05 23 25 30
http://127.0.0.1:3000/tasks/1
ScreenShot 2022 11 05 23 25 44
http://127.0.0.1:3000/tasks
ScreenShot 2022 11 05 23 26 29
http://127.0.0.1:3000/tasks/1/edit
ScreenShot 2022 11 05 23 26 47
エレキベア
エレキベア
基本的なCRUD機能がコマンド一つで作成されるのはすごいクマね

MVCの関連性

マイケル
マイケル
URLで指定のパスを開くと、
・controllerの対象のアクション(関数)が呼ばれる
・controllerのアクションに対応したviewが表示される
といった流れで画面が表示されます。
class TasksController < ApplicationController
  before_action :set_task, only: %i[ show edit update destroy ]
  # GET /tasks or /tasks.json
  def index
    @tasks = Task.all
  end
  # GET /tasks/1 or /tasks/1.json
  def show
  end
・・・省略・・・
↑controller内の各アクションが呼ばれる
app/views/tasks
├── _form.html.erb
├── _task.html.erb
├── _task.json.jbuilder
├── edit.html.erb
├── index.html.erb
├── index.json.jbuilder
├── new.html.erb
├── show.html.erb
└── show.json.jbuilder
↑アクションに対応したviewが表示される
マイケル
マイケル
viewクラスはデフォルトではerbというRubyの埋め込みができる形式が採用されています。
また、modelに関してもapp/modelsフォルダ配下に作成されていますが、データを作成しただけだと特に何も指定されていません。
class Task < ApplicationRecord
end
↑modelには何も指定されていない
マイケル
マイケル
項目名はテーブル定義の方を参照していて、バリデーションやテーブル同士の関連、固有の処理を定義したい場合に追記する使い方になります。
エレキベア
エレキベア
シンプルで分かりやすいクマ〜〜〜

Railsコンソールでのデータ操作

マイケル
マイケル
Railsコンソールという機能を使用することでRubyの処理を確認することができます。
こちらの機能を用いてmodelのデータを操作してみましょう!
コンソールには rails console コマンドで入ることができます。
rails console – Railsドキュメント
# Railsコンソールに入る
bundle exec rails console
マイケル
マイケル
modelで定義したテーブルに関しては、SQLを使わずにTask.allというような独自の形式を用いてテーブルを操作することができます。
# Taskテーブル全件検索
irb(main):001:0> Task.all
  Task Load (0.1ms)  SELECT "tasks".* FROM "tasks"
=> [#<Task:0x0000000110d34f58 id: 1, content: "寝る", created_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00>]
↑SQLを使わずに操作できる
エレキベア
エレキベア
わざわざSQLを書かなくてもいいのは便利クマね
マイケル
マイケル
他にもid指定で検索したり、データを作成したりなど、
一般的なテーブル操作は行えるようになっています!
# id指定で検索
irb(main):002:0> Task.find(1)
  Task Load (0.1ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<Task:0x0000000110c9e788 id: 1, content: "寝る", created_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00>
# データ作成
irb(main):003:0> task = Task.create(content: "二度寝する")
  TRANSACTION (0.1ms)  begin transaction
  Task Create (0.4ms)  INSERT INTO "tasks" ("content", "created_at", "updated_at") VALUES (?, ?, ?)  [["content", "二度寝する"], ["created_at", "2022-11-05 14:31:16.292924"], ["updated_at", "2022-11-05 14:31:16.292924"]]
  TRANSACTION (0.8ms)  commit transaction                              
=> #<Task:0x00000001110b4638 id: 2, content: "二度寝する", created_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00>
# saveしないとデータは挿入されない
irb(main):004:0> task.save!
=> true
irb(main):005:0> Task.all
  Task Load (0.1ms)  SELECT "tasks".* FROM "tasks"
=>                                                                     
[#<Task:0x0000000110b87390 id: 1, content: "寝る", created_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00>,
 #<Task:0x0000000110b872c8 id: 2, content: "二度寝する", created_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00>]
# データ削除
irb(main):006:0> task.destroy
  TRANSACTION (0.0ms)  begin transaction
  Task Destroy (0.3ms)  DELETE FROM "tasks" WHERE "tasks"."id" = ?  [["id", 2]]
  TRANSACTION (0.8ms)  commit transaction                              
=> #<Task:0x00000001110b4638 id: 2, content: "二度寝する", created_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:31:16.292924000 UTC +00:00>
irb(main):007:0> Task.all
  Task Load (0.1ms)  SELECT "tasks".* FROM "tasks"
=> [#<Task:0x0000000111156af0 id: 1, content: "寝る", created_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00, updated_at: Sat, 05 Nov 2022 14:25:35.731950000 UTC +00:00>]
マイケル
マイケル
その他の使い方や詳細についてはドキュメントを見てみましょう!
モデル(model) – Railsドキュメント
エレキベア
エレキベア
これは慣れてしまうと離れられなくなりそうクマ〜〜〜

おわりに

マイケル
マイケル
というわけで今回はRailsを軽く触ってみました!
どうだったかな??
エレキベア
エレキベア
まだ触りクマが、いろんなものがデフォルトでサポートされていて
開発効率がよさそうな感じがしたクマ〜〜〜
マイケル
マイケル
名前の通りレールがしっかり敷かれている感じがして
触っていても気持ちがいいね!
マイケル
マイケル
今回はScaffoldで作成したけど、次は一から簡単なアプリを作ってみよう!
次回もお楽しみに〜〜〜〜!
エレキベア
エレキベア
クマ〜〜〜〜
【Rails7】Ruby on Rails7のローカル環境構築とScaffoldでのアプリ作成 〜完〜

コメント