2011-12-09 7 views
8

モデルのネストされたフィールドを初期化するための「適切な」方法を理解したいと思います。Railsフォームのネストされたフィールドを適切に初期化する方法

のは、あなたがモデルのためのいくつかのネストされたフィールドを持っているとしましょう:

class User 

    has_one :address 
    accepts_nested_attributes_for :address 
end 

そして、あなたはfields_for呼び出しでそれらを使用する(この場合はaddress)これらの属性を初期化する必要があります。

これまで私はこれを行う3つの方法を考えました。

まず、モデルのafter_initializeフック:

class User 
    after_initialize :init_address 

    protected 
    def init_address 
    address ||= build_address 
end 

その後、我々はコントローラで初期設定があります。

class UsersController 
    def new  
    @user = User.new 
    @user.build_address 
    end 
end 

をそして最後に、私たちは私たちのためにそれを行うためのヘルパーメソッドを持つことができます。

標準または「ベストプラクティス」に似ているものはありますかシナリオですか?どうやってやるの?

+0

もっと良い解決策がないので、私はこのことを担当する宝石を書きました。https://github.com/febuiles/auto_build –

+0

古い投稿のようです。どのバージョンのRailsを使用していますか? –

答えて

0

私はbuild_addressがすでにhas_oneアソシエーションを宣言したあと、ビルドのためにビルドされていると信じているので、そのビットをurselfに書き込む必要はありません。 フォームが新しいアクションからのみ呼び出された場合、本当に必要なのはコントローラービットだけです。その他

+0

コードにtypoがありましたが、 'build_address'の代わりに' init_address'と呼ばれるべきです。今はっきりしていることを願っています。 –

+0

'@ user.addresses.build'と思っていましたか? –

+0

@macek:1つの項目(has_one関係)に対して、build_fieldを使用します。複数の項目(has_many)の場合、fields.buildを使用します。 –

2

ネストされた属性が親モデルなしで全く意味を持たない場合、これらのネストされたモデルの初期化は、親モデルの責任で行う必要があります。

なぜUsersController@user.addressesの構築または初期化の処理に気を付けるべきかわかりません。コントローラにこの責任を与える私にとっては、おそらくcreateで、ネストされた属性(モデル内で発生する)を解析して構築する必要があるはずです。

私は最初のアプローチに行きます。

+0

ネストされたフォームの場合、最初の方法は失敗します。ネストされたオブジェクトは再初期化され、ネストされたフォームは検証に失敗することがあります。 – Bot

関連する問題