Rails 基礎 Part 01 -- rails で API を作って curl で確認する。
Tags: ruby, rails
Published: 2023-04-23 15:30:28

#＃ 前提

一つ前の記事で ruby 3.2.2 が動く状態になっている

---

## 結論

Rail で最速で API を作るためには
このフローが必要。

1. gem で bundler と rails をインストールする。
2. rails new の --api で API 用のプロジェクトを作成する。
3. rails generate scaffold で テーブル定義を引数にし、 MVC と migration 生成ファイルを作成する
4. rails db:migrate で　migration ファイルでテーブルを作成する。sqlite に。
5. db/seeds.rb ファイルを作成し、テーブル定義に則って初期データを書く
6. rails db:seed で seed ファイルでテーブルにデータを挿入する。
7. routes.rb ファイルにルーティングを書く。
8. rails serevr でアプリを起動する
9. curl でルートに向けて打ち、レスポンスを確認する。

## gem とは？

gem とは、Ruby のパッケージマネージャー。
Ruby を入れた際についてくる。

これで rails などをインストールする。

----

## bundle をインストール

```ruby
gem install bundler

Fetching bundler-2.4.12.gem
Successfully installed bundler-2.4.12
```

gem で bundler を入れる。

これにより、Gemfile を作成できる。
Gemfile は ruby の依存を一括管理できる。
npm の package.json のように。

git clone でプロジェクトを入れてすぐに、
bundle install でライブラリを全て入れられる。
npm install と同じように。

### Gemfile の例

一例として rails を入れるとこのようになる

```php
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby "3.2.2"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.4", ">= 7.0.4.3"

# Use sqlite3 as the database for Active Record
gem "sqlite3", "~> 1.4"

# Use the Puma web server [https://github.com/puma/puma]
gem "puma", "~> 5.0"    
```

----

## rails をインストール

```ruby
gem install rails
```

rails のインストールを始めると

```ruby
Done installing documentation for zeitwerk, thor, method_source, concurrent-ruby, tzinfo, i18n, activ
esupport, nokogiri, crass, loofah, rails-html-sanitizer, rails-dom-testing, rack, rack-test, erubi, b
uilder, actionview, actionpack, railties, mini_mime, marcel, activemodel, activerecord, globalid, act
ivejob, activestorage, actiontext, mail, actionmailer, actionmailbox, websocket-extensions, websocket
-driver, nio4r, actioncable, rails after 42 seconds
35 gems installed
```

rails の他に
rails-html, i18n, rails-html-santitizer,
他様々な依存性 35 つがインストールされる。

---

## rails プロジェクトを作成。API モードで。

```ruby
rails new bank_transactions_api --api -T                                        
                                                                                                     
      create                                                                                         
      create  README.md                                                                              
      create  Rakefile                                                                               
      create  .ruby-version                                                                          
      create  config.ru                                                                              
      create  .gitignore                                                                             
      create  .gitattributes                                                                         
      create  Gemfile                                                                                
         run  git init from "."  
```

API モードでテストをスキップしてプロジェクトを作成する。

Rakefile や Gemfile が作られる。
git init までしてくれる。

```ruby
      create  app/views/layouts/application.html.erb                                                 

      create  app/controllers/concerns/.keep                                                         
      create  app/models/concerns/.keep                                                              
      create  bin                                                                                    
      create  bin/rails 
```

models, view, controllers,
これらを生成する。

```ruby
      create  config/environments                                                                    
      create  config/environments/development.rb                                                     
      create  config/environments/production.rb                                                      
      create  config/environments/test.rb      
```

リリース用の環境ファイルまで作っている。

---

### API モードとは？

1. render のレスポンスが JSON になる
  a. config/application.rb に設定が
2. MVC の View がほぼできなくなる
3. Controller の提供機能が API 系のみに最適化される。

こうやってスマートに生成できるオプション。

---

## rails generate で MVC と migration ファイルを作成する

* 銀行取引テーブル
  1. アカウントID
  2. 金額量
  3. 説明

このテーブルとカラムの構成で、MVC と migration ファイルを作成する。

```ruby
rails generate scaffold \
BankTransaction \
account_number:string \
amount:decimal \
description:string
```

rails の generate scaffold では

1. MVC
2. テスト
3. ルーティング
4. マイグレーションファイル（初期テーブルの作成クエリ）

これらを生成できる。
scaffold は生成ファイルを増やすオプション。

```ruby
      invoke  active_record
      create    db/migrate/20230423145010_create_bank_transactions.rb
      create    app/models/bank_transaction.rb
      invoke  resource_route
       route    resources :bank_transactions
      invoke  scaffold_controller
      create    app/controllers/bank_transactions_controller.rb
      invoke    resource_route
```

このようにログが出て

```ruby
class CreateBankTransactions < ActiveRecord::Migration[7.0]                                          
  def change
    create_table :bank_transactions do |t| 
      t.string :account_number
      t.decimal :amount
      t.string :description

      t.timestamps
    end 
  end 
end
```

db/migrate に上記のファイルが作成される。
開いてみると上記のようにテーブルを作るコードが記述されている。

---

## rails db:migrate でマイグレーションクエリを実行する

```ruby
rails db:migrate
== 20230423145010 CreateBankTransactions: migrating ===========================
-- create_table(:bank_transactions)
   -> 0.0022s
== 20230423145010 CreateBankTransactions: migrated (0.0022s) ==================
```

これでテーブルが作成された。

```ruby
rails console
Loading development environment (Rails 7.0.4.3)
irb(main):001:0> ActiveRecord::Base.connection.tables
=> ["schema_migrations", "ar_internal_metadata", "bank_transactions"]
```

テーブル一覧に bank_transactions が作成されている。

---

## rails server で html を出せるのを確認

```ruby
Rails.application.routes.draw do
  resources :bank_transactions, only: [:index, :show]
end
```

これを route.rb に書くと、
index と detail で rails アイコンが見えるようになる。

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72yih4o46m110nai1qne.png)

---

## レコードが JSON で返って来るようにする

seed で仮のデータを挿入する

```ruby
BankTransaction.create!(
  account_number: "1234567890",
  amount: 1000.0,
  description: "Sample transaction"
)
```

一つだけレコードを挿入する。
db/seeds.rb ファイルに書く。

```ruby
rails db:seed

```

実行してレスポンスはない。

---

## API に curl してテストする

seed でデータを入れた。
rails server で起動して curl する。

```ruby
curl localhost:3000/bank_transactions/ | jq .
```

すると

```json
[
  {
    "id": 1,
    "account_number": "1234567890",
    "amount": "1000.0",
    "description": "Sample transaction",
    "created_at": "2023-04-23T15:20:55.616Z",
    "updated_at": "2023-04-23T15:20:55.616Z"
  }
]
```

しっかりとレスポンスが帰ってくる。


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmgm7xsmhz0bopjtvqxh.png)

クエリも動いている。

----

## おまけ。コントローラー。

これは generate した時に創られている。

```ruby
class BankTransactionsController < ApplicationController
  def index
    @bank_transactions = BankTransaction.all
    render json: @bank_transactions
  end
end
```

テーブルから持ってきて、json にして render する。
At Mark をつけることで rails は props みたいにパスできる。

---