Noob issue with virtual attributes

Hello, I have 2 models, city and tip. A city an have only one tip. So what i am trying to do is to add my tip properties to the city form and create or update the city with his child the tip. but what i've done so far isn't working... I have this error: undefined method `build' for nil:NilClass

Model City: class City < ActiveRecord::Base   attr_accessible :name, :continent, :tip_attribute

  has_one :shop   belongs_to :city_preferences   belongs_to :tip

  validates_presence_of :name,:continent   def tip_attribute     tip   end

  def tip_attribute=(attribute)     tip.build(attribute)   end

end

City form view: <% form_for @city do |f| %>   <%= f.error_messages %>   <p>     <%= f.label :name %><br />     <%= f.text_field :name %>   </p>   <p>     <%= f.label :continent %><br />     <%= f.text_field :continent %>   </p> <p><%= f.label :Tip %></p>   <%fields_for "city[tip_attribute]", @city.tip do |t| %>     <p>Min <%= t.text_field :min %><br />     <p>Max <%= t.text_field :max %>   <%end%>   <p><%= f.submit "Submit" %></p> <% end %>

Greg

If you have a has_many you can do tips.build(...) but with belongs_to and has_one you need to call build_tip instead

Fred

Frederick Cheung wrote:

If you have a has_many you can do tips.build(...) but with belongs_to and has_one you need to call build_tip instead

Fred

Thanks Fred, it works better now. But an have another issue. Now the data are stored in the database but the column city_it in the table tips is nil. Do i have the set it the setter like this?

  def tip_attribute=(attribute)     attribute[:city_id] = self.id     build_tip(attribute)   end

Tip model: class Tip < ActiveRecord::Base   attr_accessible :min,:max,:city_id

  has_one :city

  validates_numericality_of :min, :only_integer => true   validates_numericality_of :max, :only_integer => true end

It does work if I do this, but is it the correct way to do it? should it be filled automaticly by active record?

Greg