リポジトリをrenderにデプロイしてみる

# 目的

railsの勉強をしたい。
せっかくならこの世に放ちたいので、renderを使ってデプロイしようと思いました。
1年前に一度、パンの材料を投稿するwebアプリを作ったことがありますが、
ほとんど全部忘れているので備忘録としてQiitaも書きます。（~~可能な限り~~）


# 今回やること

今回の目標は以下の5つ。
1. 新しい Rails のアプリケーションを作成
1. GitHub を導入
1. Rails のデータベース管理システムを PostgreSQL にする
1. render でデプロイ
1. 動作確認


# 環境
* windows 10
* VSCode 1.77.0
* ruby 3.0.4
* Rails 6.1.4.4
* SQLite 3.41.2
* PostgreSQL 15


# いざ出陣
といっても、こちらのサイトを参照すれば基本的にはいけました。

https://qiita.com/yuuki-h/items/9f594c046a6e676eb8f8

実行したコマンドは以下。
（ # はサイトを参照して手順に進めます。）

``` :cmd
cd Desktop                     // フォルダを作成するディレクトリに移動
rails new アプリ名              // 任意のアプリ名で作成
cd アプリ名                     // 作成したアプリに移動 (以降、同ディレクトリで作業)
git init                       // 自動で実行されるが一応初期化
git add -A                     // ステージエリアに全てのファイルを追加
git commit -m "first commit"   // commit
git remote add origin http://Github.com/GitHubで作成したID/リポジトリ名.git
                               // リモートレポジトリの登録
git push -u origin master      // Push

# Gemfile, database.yml の編集

bundle config set --local without 'production' // 後述
bundle lock --add-platform x86_64-linux        // 後述
bundle install                                 // ライブラリをインストール

# Railsアプリの作成
# Webサービスの作成/設定
# データベースの作成
# Railsアプリとデータベースの接続
```
サイトにあるようにリンクを開くと、以下のような画面になると思いますが、いったんこれでOKです。
後でページを作って動作確認をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693325/7456ecda-7095-f5c5-21bb-eab24b4689c3.png)


# 気になったところ
気になったところがあったので以下にまとめます。

### bundle config set --local without 'production' について
サイトでは
``` :cmd
bundle install --without production
```
を実行するとありましたが、非推奨らしい。
`--without` フラグは、インストール時に production グループの Gem をインストールしないようにしますが、 Bundler はこの設定を覚えないため、このコマンドはそれを覚えさせるためのものです。
これによって以降、単に `bundle install` で良くなります。

### bundle lock --add-platform x86_64-linux について

`bundle lock --add-platform x86_64-linux` を実行しないままデプロイすると、

> /opt/render/project/.gems/gems/bundler-2.2.33/lib/bundler/definition.rb:432:in \`validate_platforms!': Your bundle only supports platforms ["x64-mingw32"] but your local platform is x86_64-linux. Add the current platform to the lockfile with \`bundle lock --add-platform x86_64-linux` and try again. (Bundler::ProductionError)

とエラーになります。bundle は `x64-mingw32` プラットフォームのみをサポートしており、ローカルプラットフォームが `x86_64-linux` であることが原因のようです。このコマンドは、Gemfile.lock に `x86_64-linux` プラットフォームを追加し、 Bundler にもこのプラットフォームをサポートする gem を含めるよう指示します。
正味、意味はあんまり分からないけど実行したら解決しました。

``` :cmd
bundle lock --add-platform x86_64-linux  // Gemfile.lock に "x86_64-linux" プラットフォームを追加
bundle install                           // ライブラリをインストール
```


# 動作確認
デプロイしたページが表示されるかを確認します。


### データベースの作成
データベースは基本的にアプリケーションに1:1で結びついているため、データベースの作成は1度だけすれば問題ありません。

``` :cmd
rails db:create    // データベースの作成
rails db:migrate   // マイグレーション
```


### コントローラーの作成
以下のコマンドを実行してコントローラーを作成します。コントローラーの名前(ここでは tests )は任意ですが、複数形で付けることが命名規則になっています。
コントローラーが何かわからない人は、[こちらのサイト](https://qiita.com/s_emoto/items/975cc38a3e0de462966a "MVCモデルについて")を参照し、MVCモデルについて目を通すと良いと思います。

``` :cmd
rails g controller tests   # testsコントローラーを作成する
```


### コントローラーにアクションを定義
app > controllers フォルダに入っているtest_controller.rbを以下のように編集します。

``` ruby:app/controllers/tests_controller.rb
class TestsController < ApplicationController
    def index
        
    end
end
```

データベースへアクセスする際は、 `def index` と `end` の間にいろいろ書きますが、今回は省略します。


### アクションに対応するビューを作成
app > views > tests フォルダに入っているindex.html.erbを作って、以下を記述します。

``` html:app\views\tests\index.html.erb
Hello World!
```

`Hello World!` と表示するだけのコードです。
`.erb` 拡張子は、 HTML、XML、CSS、JavaScript などの静的なファイルの中に、 Ruby コードを埋め込んで動的にコンテンツを生成するために使用されます。


### ルーティング
configフォルダにあるroutes.rbファイルを以下のように編集します。

``` ruby:config\routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  resources :tests
  root   'tests#index'
end
```

`resources :tests` は、標準的な8つのルーティングをまとめて定義するもので、このルーティングのみを使ってアプリケーションを作ることが推奨されています。
`root   'tests#index'` は、 render のURLを踏んだ時にそのままページが表示されるように追加しました。


### デプロイ
以下のコマンドで、 GitHub に変更を Push すると自動でデプロイが始まります。

``` :cmd
git add -A                     // ステージエリアに全てのファイルを追加
git commit -m "first commit"   // commit
git push -u origin master      // Push
```

render から web ページの URL を開き、画面右上に`hello world!` と表示されていれば OK です！


# 余談
> Web Services on the free instance type are automatically spun down after 15 minutes of inactivity. When a new request for a free service comes in, Render spins it up again so it can process the request.

無料版の render では15分リクエストがないと、サーバーが閉じるため開くのに時間がかかります。
サイト作成がもうちょい進んだら、有料版にしようかな。