Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Polymorphic Association and Nested Attributes: :error=>:blank

I am trying to save a deeply nested form. There are three different models: Applications, Applicants, and Addresses. Addresses are polymorphic, as both Applications and Applicants can have them. These are the params that I'm sending:

{"application"=>{
    "loan_type"=>"purchase",
    "loan_amount"=>2500000,
    "borrower_attributes"=>{
        "first_name"=>"Test",
        "middle_name"=>"Test",
        "last_name"=>"Test",
        "birthdate"=>"01/01/1970",
        "phone"=>"1231231234",
        "email"=>"[email protected]",
        "marital_status"=>"married",
        "address_attributes"=>{
            "street_address"=>"xxxx Mission Street",
            "city"=>"San Francisco",
            "state"=>"CA",
            "zip"=>xxxxx
        }
    }
}}

When this is sent in my request, I'm getting the following response:

<Address id: nil, street_address: "1045 Mission Street", city: "San Francisco", state: "CA", zip: 94103, addressable_type: "Applicant", addressable_id: nil, created_at: nil, updated_at: nil>

And the following error message:

@messages={:"borrower.address.addressable"=>["must exist"]}, @details={"borrower.address.addressable"=>[{:error=>:blank}]}

Why is it that I can't set the nested attributes? What do I need to fix to make this work?

Here are my relevant files:

Application.rb

class Application < ApplicationRecord
    before_save :assign_addresses!
    belongs_to :borrower, class_name: 'Applicant'
    belongs_to :coborrower, class_name: 'Applicant', optional: true
    has_one :address, as: :addressable

    accepts_nested_attributes_for :borrower
    accepts_nested_attributes_for :coborrower
    accepts_nested_attributes_for :address
end

Applicant.rb

class Applicant < ApplicationRecord
    has_many :applications
    has_one :address, as: :addressable
    validates_presence_of :first_name, :last_name, :phone, :email, :birthdate

    accepts_nested_attributes_for :address
end

Address.rb

class Address < ApplicationRecord
    belongs_to :addressable, polymorphic: true
    validates_presence_of :street_address, :city, :state, :zip
end

Applications_Controller.rb

class Api::ApplicationsController < ApplicationController

    ...

    def create
        @application = Application.new(application_params)

        if @application.save
            render json: @application, status: :created
        else
            render json: @application.errors, status: :unprocessable_entity
        end
    end

    private

    def application_params
        params.require(:application).permit(:loan_type, :loan_amount, borrower_attributes: [:first_name, :middle_name, :last_name, :birthdate, :phone, :email, :ssn, :marital_status, address_attributes: [:street_address, :city, :state, :zip]])
    end
end
like image 566
Louis Cruz Avatar asked May 17 '16 16:05

Louis Cruz


1 Answers

Found the issue. Things worked fine after adding optional: true to the Address belongs_to. This is a new Rails 5 convention. I remembered to put it on my coborrower, but not there. Hope this helps someone!

like image 67
Louis Cruz Avatar answered Oct 28 '22 03:10

Louis Cruz