質問
私には子供である親がいaccepts_nested_attributes_forます。そのため、親用のフォームがある場合はbuild、子用のフォーム フィールドも表示できるようにする必要があります。私が知りたいのはbuild、子供はどこに行けばいいですか? モデル、ビュー、またはコントローラーで?
なぜ私はこれを求めているのですか
あなたは頭を振って、私がこのような質問をする狂人だと思っているかもしれません.
私は次のようなモデルを持っていCustomerます:accepts_nested_attributes_forbilling_address
class Customer
belongs_to :billing_address, class_name: 'Address'
accepts_nested_attributes_for :billing_address
end
ユーザーに新しいフォームを提示するとき、ユーザーが実際に のフィールドを見ることができるようにCustomer、空白があることを確認したいと思います。したがって、コントローラーには次のようなものがあります。billing_addressbilling_address
def new
@customer = Customer.new
@customer.build_billing_address
end
ただし、ユーザーがフィールドに入力せずに無効なフォームを送信しようとすると、コントローラーのアクションにこのようなものを配置しない限り、billing_addressのフィールドがなくなったフォームが表示されます:billing_addresscreate
def create
@customer = Customer.new(params[:customer])
@customer.build_billing_address if @customer.billing_address.nil?
end
もう 1 つの問題があります。ユーザーが を編集しようとして、CustomerまだCustomerが関連付けられていない場合、billing_addressのフィールドが表示されないということbilling_addressです。したがって、次のようなものをコントローラーに追加する必要があります。
def edit
@customer = Customer.find(params[:id])
@customer.build_billing_address if @customer.billing_address.nil?
end
updateまた、コントローラーのメソッドでも同様のことが発生する必要があります。
とにかく、これは非常に反復的であるため、モデルで何かを行うことを考えました. 私の最初の考えは、次のafter_initializeように、モデルのイベントにコールバックを追加することでした:
class CustomerModel
after_initialize :build_billing_address, if: 'billing_address.nil?'
end
しかし、私のスパイダーマンの感覚はチクチクし始めました。Customer将来、コードの他の部分で a をインスタンス化して、これが予期しない方法で大混乱を引き起こすことはないと誰が言いますか。
したがって、私の現在の考えでは、これを行うのに最適な場所はフォームビュー自体であるということです。私が達成しようとしているのはフォームに空白を設けることでbilling_addressあり、フォーム自体はコード内で私が知っている唯一の場所だからです。のフォームを表示しようとしていることを確認してbilling_addressください。
しかし、ご存知のように、私はインターネット上の単なる男です。どこに行けばいいbuild_billing_addressですか?