Trip
Trip

Reputation: 27124

Is it possible to pass params from to a before_create in a model?

I have a model, for example :

class Account < ActiveRecord::Base

  before_create :build_dependencies

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

The initial params are sent in through a hidden form tag on the Account#new form.

But there's no reason/need for these params to be saved to the account model. I just need them in the NiftyObject model.

Is there a clever way to pass these params to the before_create method ? Or any other alternatives that might accomplish the same task?

Thanks!

Upvotes: 4

Views: 5446

Answers (3)

Matzi
Matzi

Reputation: 13925

You can use instance variables to workaround this, and do +1 step from the controller:

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

In the controller:

  def Create
    account = new Account(params)
    account.assign_params_from_controller( ... )
    account.save   # this will trigger before_create
  end

Upvotes: 3

Trip
Trip

Reputation: 27124

I appreciate everyone's answers. But I finally am going with an attr_accessor instead. In this way, it doesn't save anything anywhere, but would still be accessible from the model in a before_create method.

Upvotes: 2

Jesse Wolgamott
Jesse Wolgamott

Reputation: 40277

I believe the active-record callback cycle hurts you in most cases, this included. Instead of using before_create, I recommend you use a service object that coordinates the creation of Account and nifty-object.

I assume you want nifty-object to know about the account, so I passed it in to it's create method.

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

Upvotes: 2

Related Questions