That's interesting, again thank you very much for you help.
I too think that your idea is better :)

Thanks & Regards,
Dhruva Sagar.


Samuel Goldwyn<http://www.brainyquote.com/quotes/authors/s/samuel_goldwyn.html>
- "I'm willing to admit that I may not always be right, but I am never
wrong."

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

>
> 2009/8/29 Dhruva Sagar <[email protected]>:
> > 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.
> >
>
> You could ask yourself who knows what are the valid options that a
> user may select?  The answer may be the model, depending on your
> application.  If so then put it in a model method.  I am not talking
> about how to display the selection (drop down, radio buttons, check
> boxes or whatever), that is a decision for the view and it's helpers.
> Possibly in the future there may be a need to disallow certain
> selections based on criteria in the db.  In this case if a model
> method provides the selection the change will be in the model.  If you
> have code like
> f.select :model1_id, Model1.all.collect { |m1| [m1.name, m1.id] }
> in the view/helper then it becomes messy.
> f.select :model1_id, Model1.get_selection_data
> is arguably better.
>
> Colin
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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