On 21 Oct 2008, at 15:56, Rainer Frey wrote:

>
> Hi,
> I want to use an associated model in an overwritten attribute write
> method. But this fails on create, as the association is not yet
> initialized. Code is:
>
> class Forward < ActiveRecord::Base
>  belongs_to :domain
>  validates_presence_of :domain, :destination
>  validates_uniqueness_of :name, :scope => :domain_id
>
>  def destination=(dest)
>      dest = dest + '@' + domain.name unless (domain.blank? || dest  
> =~ /@/)
>      write_attribute :destination, dest
>  end
> end
>
> When calling destination= and then save, it works fine, put when
> calling Forward.new(attributes) from the controller, domain yields nil
> in destination=, even though domain is initialized before saving, and
> validation succeeds.
>
> How can I achieve that destination= is executed correctly when  
> creating
> a new Forward?

Forward.new(attributes) boils down to:
- create a blank instance
- attributes.each {|k,v| object.send("#{k}=",v)

hashes are unordered so you can't rely on domain being set before  
destination is.

Fred
>
> I tried the following callback in Forward:
>  before_validation_on_create { |record|  
> record.destination=record.destination}
> and it seems to work. Is this correct, or might this have some side
> effects? It also seems quite hacky, is there a cleaner way?
>
> Regards
> Rainer Frey
>
>
>
> >


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to