下記のようなエラーがよく起きるとき、デバックツールを使ってみる方法がありますが、
デバック方法なんてわからない
デバック以外の方法ってあるの?
という方もいると思います
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
これでエラーが解消されると思います
ご不明点、訂正部分ございましたらご連絡のほどよろしくお願いいたします