"Unprocessable Entity"バリデーションに失敗しました
解決したいこと
各市区町村(municipality)に紐づく事業所(office)を登録したいと思っています。
municipality_id(外部キーの値)をpostmanで入力したはずですが、「バリデーションに失敗しました: Municipalityを入力してください」と表示されます。
※今回、officesテーブルのcityカラムに市区町村を入力し、municipalityモデルを検索して該当するnameカラムがあれば、municipality_idを紐付けて新規登録するという仕様で考えています。
(例)札幌市が入力されたら、Municipalityモデルをfind_byなどで検索する。
そしてmunicipality_id:1のname:"札幌市"と一致させて、officesテーブルのレコードに登録させる。
発生している問題・エラー
タイトルの通り、以下のエラーが発生しています。
"status": 422,
"error": "Unprocessable Entity",
"exception": "#<ActiveRecord::RecordInvalid: バリデーションに失敗しました: Municipalityを入力してください>"
該当するソースコード
office.rb
class Office < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
belongs_to :municipality
attr_accessor :type
self.inheritance_column = :_type_disabled
validates :name, presence: true, length: { maximum: 20 }
before_validation :remove_dashes
validates :post_code, presence: true
validates :prefecture, presence: true
validates :city, presence:true
validates :town, presence: true
(省略)
offices_controller.rb
module Api
module V1
module Clients
class Admin::OfficesController < ApplicationController
before_action :configure_permitted_parameters, if: :devise_controller?
def index
@offices = Office.order(created_at: :desc)
render json: {status: 'SUCCESS', message: 'Loaded offices', data: @offices}
end
def create
@office = Office.new(office_params)
# m_id = Municipality.find_by(name: params[:city])
# @office.municipality = m_id
if @office.save!
render json: { status: 'SUCCESS', data: @office }
else
render json: { status: 'ERROR', data: @office.errors }
end
end
def new
@office = Office.new
render json: { status: 'SUCCESS', data: @office }
end
protected
def configure_permitted_parameters
added_attrs = [ :name, :post_code, :prefecture, :city, :town, :building, :municipality_id ]
devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
end
private
def office_params
params.permit(:name, :post_code, :prefecture, :city, :town, :building, :municipality_id)
end
end
end
end
end
db/migrate/20221016151105_create_offices.rb
class CreateOffices < ActiveRecord::Migration[7.0]
def change
create_table :offices do |t|
t.string :name
t.references :municipality, foreign_key: true
t.timestamps
end
end
end
db/migrate/20221017105302_add_all_columns_to_offices.rb
class AddAllColumnsToOffices < ActiveRecord::Migration[7.0]
def change
add_column :offices, :post_code, :string
add_column :offices, :prefecture, :string
add_column :offices, :city, :string
add_column :offices, :town, :string
add_column :offices, :building, :string
end
end
自分で試したこと
下記のoptional: trueを追記したら、登録はされました。しかし、外部キーがnullになってしまうので、登録するofficeデータに外部キーのmunicipality_idを紐付けたいという今回の目的とは異なる気がします。
office.rb
belongs_to :municipality, optional: true
外部キーのidを入力した場合、以下のエラーになります。
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table \"offices\" violates foreign key constraint \"fk_rails_3c181855c5\"\nDETAIL: Key (municipality_id)=(1) is not present in table \"municipalities\".\n>",
0