質問
私には子供である親がいaccepts_nested_attributes_for
ます。そのため、親用のフォームがある場合はbuild
、子用のフォーム フィールドも表示できるようにする必要があります。私が知りたいのはbuild
、子供はどこに行けばいいですか? モデル、ビュー、またはコントローラーで?
なぜ私はこれを求めているのですか
あなたは頭を振って、私がこのような質問をする狂人だと思っているかもしれません.
私は次のようなモデルを持っていCustomer
ます:accepts_nested_attributes_for
billing_address
class Customer
belongs_to :billing_address, class_name: 'Address'
accepts_nested_attributes_for :billing_address
end
ユーザーに新しいフォームを提示するとき、ユーザーが実際に のフィールドを見ることができるようにCustomer
、空白があることを確認したいと思います。したがって、コントローラーには次のようなものがあります。billing_address
billing_address
def new
@customer = Customer.new
@customer.build_billing_address
end
ただし、ユーザーがフィールドに入力せずに無効なフォームを送信しようとすると、コントローラーのアクションにこのようなものを配置しない限り、billing_address
のフィールドがなくなったフォームが表示されます:billing_address
create
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
ですか?