I have a question re: pushing your business logic into your models,
with the intention that the controllers are much more leaner.
Say I have a model object Email. I am tempted to write static methods
as part of the Email which do all the business of creating, validating,
doing some other plumbing, etc.
Out of the box, Rails suggest your controller look like this
(heavily shortened for brevity)
class EmailController
def add
@email = Email.new
end
def save
@email = Email.create_with_params(params[:email], session[:foobar])
if @email.save
redirect_to :action => "success"
else
redirect_to :action => "add"
end
end
Email.create_with_params() is a custom method that does more than just
a basic Email.new, it does that, but also takes some session data and
does other stuff with it (related to the creation of the Email record,
its not completely willy-nilly).
The problem with this approach is this: if you go to the save() and the
model has failed validation, whether it be via the native validation or
custom stuff, once you do the redirect you lost your @email instance
variable, so an "error_message_for" on the add.rhtml template doesnt
contain anything. AND you cannot do a render :action => "add"
because
lets say you need to hit the DB to do other stuff to get the form
ready, etc. Basically you need to do other stuff before you can just
render the template.
So now I think you need some kind of a data-bus to hold your @email
instance var across the request.
Either session or flash comes to mind. flash is nice because it will
auto-clean up after itself. Whereas with session you would need to
remember to purge it (say, after a successful request).
Am I approaching this from the wrong angle? To clear up my controllers,
I am placing more logic into the model, which makes sense, but when you
are dealing with requests that span methods you need some way to keep
track of it all.
I am tempted to have my custom model objects return two things, a
boolean result flag and the instance itself, which I can directly place
into my data-bus (session/flash?)
e.g.
def save
result, @email = Email.create_with_params(params[:email],
session[:foobar])
if result
redirect_to :action => "success"
else
flash[:email] = @email
redirect_to :action => "add"
end
end
And then you modify add() to have a look at the flash first.... Am I
totallly crazy here?
Thanks
-william
--~--~---------~--~----~------------~-------~--~----~
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?hl=en
-~----------~----~----~----~------~----~------~--~---