2016-05-07 7 views
3

多形関連でAddressモデルを作成しましたが、クライアントモデルのネストされたアトリビュートで保存しようとしていますが、にAddress addressable must existがあります。Rails 5でポリモーフィックアソシエーションを持つネストされたアトリビュート

モデル:

class Client < ApplicationRecord 
    has_one :address, as: :addressable, dependent: :destroy 
    accepts_nested_attributes_for :address, :allow_destroy => true 
end 

class Address < ApplicationRecord 
    belongs_to :addressable, polymorphic: true 
end 

コントローラー:

class ClientsController < ApplicationController 

    def new 
    @client = Client.new 
    @client.create_address 
    end 

    def create 
    @client = Client.new(client_params) 

    if @client.save 
     ... 
    else 
     ... 
    end 
    end 

    private 
    def client_params 
    params.require(:client).permit(:first_name ,:last_name, :company, address_attributes: [:line1, :line2, :line3, :city, :state_province, :postal_code, :country]) 
    end  
end 

答えて

2
belongs_to :xx, polymorphic: true, optional: true 
+2

このコードは問題の解決に役立つかもしれませんが、_why_および/または_how_が質問に答えているとは説明していません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

+0

この回答は受け入れられるべきです。 –

+0

ここにいくつかの文脈があります:[this](https://github.com/rails/rails/issues/23960)と[this](https://github.com/rails/rails/issues/29781)を参照してください。 バグのように聞こえます: 'belongs_to'バリデーターは空の関連に遭遇する' polymorphic:true'の前に*実行されます。 – David

2
また

optional: true 

問題をだましは、次の2つのステップで、コントローラで作成を破壊することにより、必須の関係を保つこと。

def client_params 
    params.require(:client).permit(:first_name ,:last_name, :company) 
end 

def address_params 
params.require(:client).require(:address_attributes).permit(:line1, :line2, :line3, :city, :state_province, :postal_code, :country) 
end 

def create 
    @client = Client.new(client_params) 

    if @client.save 
    @client.create_address(address_params) 
    ... 

これは醜いかもしれませんが、より安全な関係を保ちます。

+0

@clientが正常に保存され、アドレスの作成に失敗した場合、2つのアクションに分かれてしまうとどうなりますか?確かに、両方を同時に失敗させて、ただ一つだけを保存するのではなくフォームにエラーを返すことを望むでしょうか? – Dercni

+1

よい通知。私はあなたのモデル関係が正しい選択をする時が来たと思います。クライアントがアドレスと副詞なしで存在できない場合は、より複雑なロジックを追加する必要があります。 –

関連する問題