Forum: Ruby on Rails Noob issue with virtual attributes

Posted by Greg Ma (gregorylepacha)
on 2010-03-09 07:31
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
Posted by Frederick Cheung (Guest)
on 2010-03-09 09:13
(Received via mailing list)
On Mar 9, 6:31 am, Greg Ma <li...@ruby-forum.com> wrote:
> 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
>

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

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
Posted by Greg Ma (gregorylepacha)
on 2010-03-09 17:32
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
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.