Reputation: 27124
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
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
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
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