I have a Project model, which has a status property. Status can either
be 0, 1, 2, or 3 - and complies with the array Project.statuses = [
:hidden, :available, :in_progress, :complete ]. This works well in all
of my application, tested and all. (Project.statuses is only used
superficially at this point, and I added Project#complete?,
Project#in_progress?, etc. - automatically - this works too)
Now, in my unit tests, I often had to set the status of the project
manually. Now, I could do this in many different ways, but I''ve set my
eyes on this one:
some_project.status = :complete
To get this to work, what I did was (in project.rb)
def status=(new_status)
if (new_status.is_a? Symbol) || (new_status.is_a? String)
new_status = Project.status_id_for new_status
end
super new_status
end
Project.status_id_for being a proper lookup (with some aliases, for
example :assigned is same as :in_progress). This works perfectly within
the testing code, and from the console.
However, this code breaks updating using the controller - the
mostly-scaffold code calls @project.update_attributes(params[:project])
(params[:project][''status''] is set by the form to the proper
numeric
value), but that, for some reason, sets @project.status to nil (which is
invalid, and I test for with validates_presence_of :status).
Now, removing my special status= method brings things back to normal,
and I could obviously do without this, but... I mean, come on, that''s
just beautiful. Any chance of this working without an ugly hack?
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---
I don''t know of an easy way to do this....anyone? Starr -- www.thebootstrapnation.com --~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Actually, now that I think about it, you could use model callbacks to do the translation for you before saving and after loading. Starr -- www.thebootstrapnation.com --~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
DOH!!!!!!!!!
Remember kids, numeric values from forms - even selections - get passed
into the controller as strings. So new_status was ''2'', not 2,
and
status_id_for(''2'') == nil.
This code works:
def status=(new_status) #:nodoc:
if (new_status.is_a? Symbol) || (new_status.is_a? String)
# If we don''t have that status in Project.statuses, leave
# new_status alone.
new_status = Project.status_id_for(new_status) || new_status
end
super new_status
end
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---