On Sat, Aug 29, 2009 at 1:21 PM, Colin Law <[email protected]> wrote:

>
> 2009/8/29 Dhruva Sagar <[email protected]>:
> > Hi everyone,
> >
> > I have recently experienced a strange behavior (strange from my
> knowledge)
> > in rails.
> >
> > In my controllers 'new' action, I am creating a few instance variables in
> > the following manner :
> >
> > @controllerModel = ControllerModel.new
> > @model1 = Model1.all
> > @model2 = Model2.all
> >
> > in my 'new' view, I am using the @controllerModel to create the form for
> new
> > and I am using the @model1 & @model2 within the form to populate 2 combo
> > boxes in the following manner :
> >
> > f.select :model1_id, @model1.collect { |m1| [m1.name, m1.id] }
> >
> > f.select :model2_id, @model2.collect { |m2| [m2.name, m2.id] }
> >
> > Now everything works fine, the form is generated fine, there are no
> errors
> > even the form submit works fine when I ensure that all the required
> fields
> > (ControllerModel validations).
> >
> > But in the event some of my validations fail and in the controller I do a
> > render :action => 'new' I  am given an error / exception for @model1 &
> > @model2 being nil. I don't understand the reason for the same, I am
> looking
> > for an explanation for this.
> >
>
> The reason is that the @model1 and @model2 variables are only
> available for the initial render of new.  They are setup by you in the
> controller, used in the view erb file to generate the html which is
> sent to the browser, then they are discarded.  Therefore when you get
> validation failures and wish to show the view again you must set up
> the variables again.  One solution is to have a private method of the
> controller called something like prepare_for_edit_or_new which you
> call where appropriate (you will likely have the same problem in edit)
> or, the solution I prefer, is to have Model1 and Model2 methods
> get_selection_data or similar that return the equivalent of
> @model1.collect { |m1| [m1.name, m1.id] } and then call this directly
> from the view, thus eliminating the need for the variables.
>
> Colin


Hi Colin,

Thank you very much for your input, I understand it now & yes it happens
with edit as well.
I think helpers is perhaps the best place to put the code for the
@model.collect in.

Thanks & Regards,
Dhruva Sagar.

Pablo Picasso<http://www.brainyquote.com/quotes/authors/p/pablo_picasso.html>
- "Computers are useless. They can only give you answers."


>
> > As a work around of course I found that if I add the following to the
> view
> > it works out fine, but I don't understand the flow fully, I want to know
> why
> > the above mentioned error occurs.
> >
> > work around in 'new' view :
> >
> > if @controllerModel.errors
> >     @model1 = Model1.all
> >     @model2 = Model2.all
> > end
> >
> > Thanks & Regards,
> > Dhruva Sagar.
> >
> >
> > Stephen Leacock  - "I detest life-insurance agents: they always argue
> that I
> > shall some day die, which is not so."
> > >
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to