ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20221105_01

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

      Ruby on Railsサーバサイド関連
      2022-11-06

      マイケル
      マイケル
      みなさんこんにちは!
      マイケルです!
      エレキベア
      エレキベア
      こんにちクマ〜〜
      マイケル
      マイケル
      いきなりだけど今日は
      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系を使って構築していきます!
      OS Mac
      Ruby 3.1.2
      Rails 7.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」を開いてみましょう!
      マイケル
      マイケル
      このように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
      http://127.0.0.1:3000/tasks/1
      http://127.0.0.1:3000/tasks
      http://127.0.0.1:3000/tasks/1/edit
      エレキベア
      エレキベア
      基本的な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でのアプリ作成 〜完〜


      Ruby on Railsサーバサイド関連
      2022-11-06

      関連記事
      【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】
      2024-04-14
      【Go言語】Gin、GORMでシンプルなREST APIを作成する【CRUD】
      2024-03-26
      【Rails7】Ruby on Rails7で主要な機能をtodoアプリで学ぶ
      2022-11-10
      【ブログ改造計画】公開中のブログをGit管理して開発環境を構築する【WordPress】
      2022-04-27
      【ブログ改造計画】WordPressの基本機能とDocker環境の構築について【WordPress】
      2022-04-24
      【NAS】QNAPのNASで最低限しておくべきセキュリティ設定
      2022-02-21
      【Unity】UnityWebRequestを使ってCRUD機能を実装する【Ruby on Rails】
      2021-12-12
      【Docker】Dockerの基本的な使い方についてまとめる
      2021-05-02