ActiveModel::UnknownAttributeErrorで躓くあなたに

下記のようなエラーがよく起きるとき、デバックツールを使ってみる方法がありますが、
```
デバック方法なんてわからない
デバック以外の方法ってあるの？
```
という方もいると思います
```
ActiveModel::UnknownAttributeError in UsersController
#create unknown attribute 'user_name' for User. 
Extracted source (around line #9): 7 8 9 10 11 12 
def create @user = User.new(user_params) 
if @user.save redirect_to root_path else
```
こちらの場合、属性が該当のモデルに定義されていないために発生するケースがあります
今回の場合、user_name という属性が User モデルに定義されていないために発生しています。


# 1. マイグレーションファイルの確認
user_name カラムがデータベースの users テーブルに存在するか確認します。もし存在しない場合、マイグレーションファイルを作成します。

```
rails generate migration add_user_name_to_users user_name:string
rails db:migrate
```
# 2. ストロングパラメーターの確認
コントローラーで user_name をストロングパラメーターに含めているか確認します。
記載されていない場合、**それが原因でエラーが起きている可能性が高いです。**
UsersController の user_params メソッドに user_name を追加します。

```ruby
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_path
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation, :user_name) # user_name を追加
  end
end
```
**ストロングパラメーターが未記載だとなぜエラーになるのか**
Railsでデータを一括で更新する際に、安全に更新するための仕組みの**ストロングパラメーター**は「ホワイトリスト形式」と呼ばれ、許可された属性のみを受け入れて、不正な属性のデータベースへの保存を防ぎます
そこに属性が欠けると、不正なパラメータがデータに影響を与えることになるので、Rails側がUnknownAttributeErrorだと主張するのです

# 3. モデルのバリデーションの確認
User モデルで user_name のバリデーションが設定されているか確認します。

```ruby
class User < ApplicationRecord
  validates :user_name, presence: true
  # その他のバリデーション
end
```
# 4. フォームの確認
user_name フィールドがフォームに含まれているか確認します。
```erb
<%= form_with(model: @user, local: true) do |form| %>
  <div>
    <%= form.label :user_name %>
    <%= form.text_field :user_name %>
  </div>
  <!-- 他のフォームフィールド -->
  <div>
    <%= form.submit "Create User" %>
  </div>
<% end %>
```
これらの手順を確認し、user_name 属性が適切に定義され、使用されていることを確認してください。

# 以下の4点確認したけど、含まれているから挫折している
すべての確認項目を実施したうえでエラーが続いている場合、意外と見落としがちなのが**データベースのスキーマ確認**です
rails db:migrateしても不具合で反映されていないこともあるので、rails db:migrateした後、schemaを確認し、直ってない場合は、手動修正しておきましょう

db/schema.rb(Before)
```Ruby
ActiveRecord::Schema[7.2].define(version: 2024_11_29_044137) do
  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
  # user_nameのスキーマが含まれていていないのが原因で上記のエラーが発生します
    t.string "email", null: false
    t.string "crypted_password"
    t.string "salt"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end
```
user_nameのスキーマが含まれていていないので、上記を追加するとエラーが解消されるのです
今回はString型のユーザーネームがnull(未記載)の場合、false(✖＝エラーとして出力)するように設定しております
db/schema.rb(After)
```Ruby
ActiveRecord::Schema[7.2].define(version: 2024_11_29_044137) do
  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: :cascade do |t|
    t.string "user_name", null: false # 追加
    t.string "email", null: false
    t.string "crypted_password"
    t.string "salt"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end
end
```
これでエラーが解消されると思います
ご不明点、訂正部分ございましたらご連絡のほどよろしくお願いいたします