4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RUNTEQAdvent Calendar 2024

Day 3

ActiveModel::UnknownAttributeErrorで躓くあなたに

Last updated at Posted at 2024-12-02

下記のようなエラーがよく起きるとき、デバックツールを使ってみる方法がありますが、

デバック方法なんてわからない
デバック以外の方法ってあるの?

という方もいると思います

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 を追加します。

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 のバリデーションが設定されているか確認します。

class User < ApplicationRecord
  validates :user_name, presence: true
  # その他のバリデーション
end

4. フォームの確認

user_name フィールドがフォームに含まれているか確認します。

<%= 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点確認したけど、含まれているから挫折している

すべての確認項目を実施したうえでエラーが続いている場合、意外と見落としがちなのがマイレグとデータベースのスキーマ確認です

db/schema.rb(Before)

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)

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

これでエラーが解消されると思います
ご不明点、訂正部分ございましたらご連絡のほどよろしくお願いいたします

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?