OK - I don't understand this - and it doesn't seem to help to add self
to this.
I have a personnel.rb model.
There is a definition in this model...
def doh_anniversary
x = 1
while doh.to_date + ( 365 * x ) <= Time.now.to_date
x += 1
end
doh + ( 365.25 * x ).floor
end
where doh is an actual column (date of hire)
In my view code, this worked...
<%= @personnel.doh_anniversary %>
but now I am putting it into a loop...
<% for personnel in @personnel %>
<%= personnel.doh_anniversary %>
<% end %>
and that gets me an error - undefined method doh.anniversary
and defining it as
def self.doh_anniversary
x = 1
while self.doh + (365 * x ) <= Time.now.to_date
...
or
while doh + ...
still returns the same undefined method error
Any hints on how to make happy method and less madness?
Craig
<snip>
In my view code, this worked...
<%= @personnel.doh_anniversary %>
but now I am putting it into a loop...
<% for personnel in @personnel %>
<%= personnel.doh_anniversary %>
<% end %>
If this is in the same view, it is understandable.
If @personnel is a single Personnel instance, acquired with
Personnel.find(some_id), then the for loop won't work. If @personnel
in the second example comes from something like Personnel.find(:all,
some_query), then try the following.
Try rendering the class name of the personnel variable in the loop:
<%= personnel.class.name %> and let us know what you get.
Cheers,
Max
Adding “self” is definitely not the right thing - doh_anniversary uses the values from a particular
instance, not the Personnel class.
I’m concerned about the error message quoted above - if it that’s the message, than your view
code has swapped . and _ - which would obviously be trouble… Make sure you’re really saying
personnel.doh_anniversary
and not personnel.doh.anniversary (which tries to call a method
named “anniversary” on the “doh” value).
And just to be pedantic, I don’t think the loop in doh_anniversary
is really what you want
anyway. From the name of the function, it seems that you’re looking to calculate the
next anniversary of a particular date. This should work pretty much the same:
def doh_
anniversary(doh)
d = Date.new(Date.today.year, doh.month, doh.mday)
d = Date.new(Date.today.year+1, doh.month, doh.mday) if d < Date.today
d
end
Two notes on the above new code:
(1) It dies rather painfully if doh is on a leap day (2/29) - you may need to rescue from
that exception if that’s important to you.
(2) It returns today’s date if the anniversary is today. Change the < to a <= if that’s not
what you want.
Hope this helps,