3

私はモデルを持っています、例えば:

class Account < ActiveRecord::Base

  before_create :build_dependencies

  def build_dependencies
    # use nifty params to build this related object
    build_nifty_object(params)
  end

初期パラメータは、Account#newフォームの非表示のフォームタグを介して送信されます。

ただし、これらのパラメータをアカウントモデルに保存する理由/必要はありません。NiftyObjectモデルで必要なだけです。

これらのパラメータをbefore_createメソッドに渡す賢い方法はありますか?または、同じタスクを実行する可能性のある他の代替手段はありますか?

ありがとう!

4

3 に答える 3

2

インスタンス変数を使用してこれを回避し、コントローラーから+1ステップを実行できます。

class Account < ActiveRecord::Base

  before_create :build_dependencies

  def assign_params_from_controller(params)
    @params = params
  end

  def build_dependencies
    # use nifty params to build this related object
    build_nifty_object(@params)
  end

コントローラ内:

  def Create
    account = new Account(params)
    account.assign_params_from_controller( ... )
    account.save   # this will trigger before_create
  end
于 2012-06-27T15:05:05.833 に答える
2

アクティブレコードのコールバックサイクルは、ほとんどの場合、これを含めてあなたを傷つけると思います。before_createを使用する代わりに、Accountとnifty-objectの作成を調整するサービスオブジェクトを使用することをお勧めします。

気の利いたオブジェクトにアカウントについて知ってもらいたいと思うので、それをcreateメソッドに渡しました。

class CreatesAccount
  def self.create(params)
    account = Account.new(params)
    return account unless account.valid?
    ActiveRecord::Base.transaction do
      account.save!
      NifyObject.create(params, account: account)
      return account
    end
  end
end
于 2012-06-27T15:12:53.133 に答える
2

皆さんの回答に感謝します。しかし、私はついにattr_accessor代わりに行きます。このように、それはどこにも何も保存しませんが、それでもbefore_createメソッドのモデルからアクセスできます。

于 2012-06-27T16:22:53.663 に答える