k12da
@k12da (K Yoshida)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

"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

スクリーンショット 2022-12-02 6.36.56.png

外部キーの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

No Answers yet.

Your answer might help someone💌