Newb: Order page, multiple view single model question

Hi I would just like to ask if someone can point me to the right
direction. I have an order page which will need to be split into 3 views
before saving say in controller:

def new
@order = Order.new
end

def process_new
@order = Order.new(params[:order])
#do validation for new

redirect to no_of_attendees

end

def no_of_attendees
@order = Order.new(params[:order])
end

def process_no_of_attendees
@order = Order.new(params[:order])
#do validation
#redirect to save page
end

Question: Is there aright way of doing this (carry params values between
views) or should I just place the data from new in session as we move to
forward to the third page create a hash from session and save in model?

Thanks,

James

P>S. Rails 2.3.10

I’m not sure if this is the right way, wht i did in the same case was,
converting it to JSON and pass the params. I didn’t like to store a
large params in session and so i did like this.

def process_new
@order = Order.new(params[:order])
end

In the view…
<%= hidden_field_tag “order_json”, @order.to_json %>

back in controller:

JSON.parse(params[:order_json])

Thanks,
Srikanth J

I think saving it in a session is the best way. as long as you don’t
store
an object in the session, it’s fine.

On Mon, Feb 21, 2011 at 2:45 PM, Srikanth J.
[email protected]wrote:

<%= hidden_field_tag “order_json”, @order.to_json %>
Posted via http://www.ruby-forum.com/.

On 21 February 2011 03:34, James allan To [email protected] wrote:

#do validation for new
#redirect to save page
end

Question: Is there aright way of doing this (carry params values between
views) or should I just place the data from new in session as we move to
forward to the third page create a hash from session and save in model?

If all you are passing back each time is the latest data for the
order, so you can do Order.new(params[:order]) as you have shown, then
there is no reason to complicate things by using the session.

You might like to consider whether the controller (and maybe the view)
would be simplified by combining the actions (and maybe views) and
passing up and back a phase value to indicate which phase of the
operation is current.

Make sure you do the validation in the model so that at each action
you are just asking the model to validate itself, rather than putting
validation code in the controller.

Colin

On 21 February 2011 07:56, Jim Ruther N. [email protected] wrote:

@order = Order.new
end

If all you are passing back each time is the latest data for the
order, so you can do Order.new(params[:order]) as you have shown, then
there is no reason to complicate things by using the session.

this is fine as long as you place the attributes in the previous step in a
hidden field so it will not be lost
when you submit the form.

It appears from the OP that even this is not necessary, as all the
required data is in params[:order].

You might like to consider whether the controller (and maybe the view)
would be simplified by combining the actions (and maybe views) and
passing up and back a phase value to indicate which phase of the
operation is current.

To do this would require a hidden field as you have pointed out.

Colin

On Mon, Feb 21, 2011 at 3:38 PM, Colin L. [email protected]
wrote:

@order = Order.new(params[:order])
#do validation

this is fine as long as you place the attributes in the previous step in
a
hidden field so it will not be lost
when you submit the form.


You received this message because you are subscribed to the Google G.
“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.

On 21 February 2011 08:50, Jim Ruther N. [email protected] wrote:

On 21 February 2011 03:34, James allan To [email protected] wrote:

@order = Order.new(params[:order])
#do validation
If all you are passing back each time is the latest data for the
required data is in params[:order].
this step asks for order’s no_of_attendees. so we’d have params[:order] =
{:no_of_attendees => no_of_attendees} available for next step.
STEP3 #process_no_of_attendees
in this action, we already lost the name attribute for order since we didn’t
add a hidden field for this attribute.
so eventhough we use params[:order] in all the actions, it’s still needed to
add hidden_field tags for attributes
filled up in the previous actions.

I see what you mean now, I was assuming the previous data would still
be visible, but I take your point, it may not be.

Colin

On Mon, Feb 21, 2011 at 4:34 PM, Colin L. [email protected]
wrote:

before saving say in controller:

Question: Is there aright way of doing this (carry params values

this is fine as long as you place the attributes in the previous step in
a
hidden field so it will not be lost
when you submit the form.

It appears from the OP that even this is not necessary, as all the
required data is in params[:order].

even if all the required data is in params[:order], he still needs to
set
the attributes
filled up in the last step as hidden fields.

for example (let’s use the OP’s actions)

STEP1. #new action
this step asks for order’s name, so we’d have params[:order] = {:name =>
name} available for next step.

STEP2 #process_new action
this step asks for order’s no_of_attendees. so we’d have params[:order]

{:no_of_attendees => no_of_attendees} available for next step.

STEP3 #process_no_of_attendees
in this action, we already lost the name attribute for order since we
didn’t
add a hidden field for this attribute.

so eventhough we use params[:order] in all the actions, it’s still
needed to
add hidden_field tags for attributes
filled up in the previous actions.


You received this message because you are subscribed to the Google G.
“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.

Guys thank you so much and yes Jim that is what is happening i guess
i’ll check the hidden and state as machine.
Thank you so much again.

On 21 February 2011 03:34, James allan To [email protected] wrote:

Question: Is there aright way of doing this (carry params values between
views) or should I just place the data from new in session as we move to
forward to the third page create a hash from session and save in model?

My view would be that the order gets saved to the DB, and you use
State Machine functionality to track which step a user is at.

Validation always only goes in the model.
Whether you have lots of “:if => Proc.new{|order| order.state =
:processing_attendees}” or have a separate OrderAttendeeRegister model
which has_many attendees and all the associated validation.

But if you store stuff in session, or hidden fields, you are blurring
your separation (and it always ended in pain when I’ve seen it done
those ways.

HTH