Rails7＋PostgreSQL＋deviseでプロジェクト作成＆ユーザー認証機能追加

## はじめに
個人でアプリ開発をしています。
自分で実施した時に失敗したので、正しい流れを記録しておきます。
誰かのお役に立てると幸いです。
同様のトラブルが起きている方向けに、後半では失敗したところも記録しています。
記載に誤りがありましたらご指摘いただけると嬉しいです。

## 環境

- macOS Sequoia 15.5
- ruby 3.3.2
- rails 7.2.2.1

## 正しい作り方

### 1. PostgreSQLをインストールする

※PostgreSQLを使ったことがあるPCであれば飛ばしてOKです。

#### 1-1. Homebrewでインストール

※Homebrewが自PCにインストールされているかどうかは$ brew -vでなんらかのバージョンが表示されていればインストールされていることになります。

```
$ brew install postgresql
```

#### 1-2. Postgresqlのライブラリlibpqを使えるようにする

```
$ echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zprofile
$ source ~/.zprofile
```

#### 1-3. 自動で起動するようにする
```
$ brew services start postgresql
```

### 2. Railsプロジェクトを作成

#### 2-1. rails newコマンド実行
```
$ rails new todoapp(アプリ名) -d postgresql
```

#### 2-2. 階層をアプリに移動
```
$ cd todoapp(アプリ名)
```

### 3. Gemをインストール
```
$ bundle install
```

### 4. DB作成
```
$ rails db:create
```

### 5. deviseを導入
```
$ bundle add devise
$ rails generate devise:install
$ rails generate devise User(モデル名)
$ rails db:migrate
```

### 6. Railsサーバー起動
```
$ rails server
```


## 以下は失敗した流れです。
やったことと解決方法を記載します。

### 1. Railsプロジェクトを作成
⚠️失敗ポイント：PostgreSQLをインストールする前にpostgresqlを使おうとした

```
$ rails new todoapp -d postgresql
> Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
~~
>Unable to find PostgreSQL client library.
~~
> An error occurred while installing pg (1.5.9), and Bundler cannot continue.
> Could not find pg-1.5.9 in locally installed gems
```
PostgreSQLがないよって言われた


### 2. Homebrewでpostgresqlをインストール
```
$ brew install postgresql
~~
> To start postgresql@14 now and restart at login:
>   brew services start postgresql@14
> Or, if you don't want/need a background service you can just run:
>   /opt/homebrew/opt/postgresql@14/bin/postgres -D /opt/homebrew/var/postgresql@14
```
postgresqlのバージョン14がインストールされた


#### 2-1. Postgreのライブラリを使えるようにする

``` 
$ echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zprofile
$ source ~/.zprofile
```

### 3. bundle installする
```
$ bundle install
> Fetching gem metadata from https://rubygems.org/.........
> Installing pg 1.5.9 with native extensions
> Bundle complete! 16 Gemfile dependencies, 103 gems now installed.
> Use `bundle info [gemname]` to see where a bundled gem is installed.
> 1 installed gem you directly depend on is looking for funding.
>   Run `bundle fund` for details
```
pg 1.5.9ってなってるからrailsで使えるようになってるはず

### 4. railsでDBを作ってみる
⚠️失敗ポイント：PostgreSQLサーバーが立ち上がってないのにrailsでPostgreを使おうとした
```
$ rails db:create
> connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
> 	Is the server running locally and accepting connections on that socket?
> Couldn't create 'todoapp_development' database. Please check your configuration.
> bin/rails aborted!
> ActiveRecord::ConnectionNotEstablished: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory (ActiveRecord::ConnectionNotEstablished)
> 	Is the server running locally and accepting connections on that socket?

> Caused by:
> PG::ConnectionBad: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory (PG::ConnectionBad)
> 	Is the server running locally and accepting connections on that socket?

> Tasks: TOP => db:create
> (See full trace by running task with --trace
```

Postgreとrailsを接続できないよっていうエラー

### 5. postgredqlサーバーを起動する
```
$ brew services start postgresql
> ==> Successfully started `postgresql@14` (label: homebrew.mxcl.postgresql@14)
```
無事サーバー起動

### 6. もう一回RailsでDBを作成
```
$ rails db:create
> Created database 'hillii_todoapp_development'
> Created database 'hillii_todoapp_test'
```
DB作成できた

### 7. deviseを追加
```
$ bundle add devise
> Fetching gem metadata from https://rubygems.org/.........
> Resolving dependencies...
```
### 8. deviseでUserモデルを作成
⚠️失敗ポイント：deviseをインストールする前にモデルを作ってしまった
```
$ rails generate devise User
>       invoke  active_record
>       create    db/migrate/20250611035155_devise_create_users.rb
>       create    app/models/user.rb
>       invoke    test_unit
>       create      test/models/user_test.rb
>       create      test/fixtures/users.yml
>       insert    app/models/user.rb
>        route  devise_for :users
```

#### 8-1. そのままmigrateでテーブルを作成（怒られた）
⚠️失敗ポイント：モデル内にdeviseが存在していて、その状態でテーブルを作成してもdeviseがまだ存在しないからエラーが出る

```
$ rails db:migrate
> bin/rails aborted!
> NoMethodError: undefined method `devise' for class User (NoMethodError)
```
### 9. モデルのdeviseの記述をコメントアウトして保存

app/modes/user.rb
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722781/d0204924-f19e-4299-b205-83c41e3233b8.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722781/8ff373b5-9edc-4010-ba14-4ff2bcf383f8.png)

config/routes.rb
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722781/baece3a2-cf93-493f-9b99-0e67a13e87b9.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722781/c22fe051-9969-4425-8a06-a9d8a07582ab.png)

### 10. ようやくdeviseをインストール

※出力内容に書かれた手動実行が必要な項目は言われた通りに実施

```
$ bin/rails generate devise:install
>       create  config/initializers/devise.rb
>       create  config/locales/devise.en.yml
>　===============================================================================
> Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
       
     * Not required *
```

### 11. ようやくテーブル作成
```
$ bin/rails db:migrate
> == 20250611035155 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0090s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0010s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0009s
== 20250611035155 DeviseCreateUsers: migrated (0.0110s) =======================
```

### 12. やっとこさRailsサーバー起動
```
$ bin/rails s
=> Booting Puma
=> Rails 7.2.2.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.6.0 ("Return to Forever")
* Ruby version: ruby 3.3.2 (2024-05-30 revision e5a195edf6) [arm64-darwin24]
*  Min threads: 3
*  Max threads: 3
*  Environment: development
*          PID: 21850
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
Started GET "/" for 127.0.0.1 at 2025-06-11 13:35:23 +0900
```

これでようやくPostgreSQLとdeviseを使ってRailsサーバーの構築をすることができました。ご覧いただきありがとうございました🙇