Remembering address details and visited page

I actually have 2 questions:

  1. Right now when a customer logs in, he gets redirected to the 1st
    page in the catalog, and the cart session is stored in the database.
    How can I redirect the customer to his last visited page at login?

  2. When the same customer checks out, he needs to fill out his
    address. There is a model for customers, which the administrator
    controls. The administrator can enter the customer’s email, address,
    phone and so on.
    How can I make that the details that are on file, get remembered and
    automatically filled out in the checkout form (so the customer does
    not have to enter them again and again)?

The models are:
cart - controls checkout
order
customer

Relationships in the Cart class are:
has_many :cart_items
has_many :products, :through => :cart_items
belongs_to :customer

An example from my checkout form:

Email

<%= text_field :order, :email %>

Any help will be much appreciated.
Cheers,
Elle

On Dec 27, 2007 10:35 PM, elle [email protected] wrote:

I actually have 2 questions:

  1. Right now when a customer logs in, he gets redirected to the 1st
    page in the catalog, and the cart session is stored in the database.
    How can I redirect the customer to his last visited page at login?

You have to store it somewhere, in the database or in a cookie perhaps?

order

<%= text_field :order, :email %>

Are you actually storing an email address with every order? Seems
like you’d just want to store the user’s id of who placed the order.
Then you can get the email from that user record.


Greg D.
http://destiney.com/

Are you actually storing an email address with every order? Seems
like you’d just want to store the user’s id of who placed the order.
Then you can get the email from that user record.

Yes, I do. And shipping address and…
Could I use something like that:

Email

<%= text_field_tag "email", "#{customer.email}" %>

instead of:

Email

<%= text_field :order, :email %>

Would Rails know to find that info? and would it still know where that
info should be stored?

Elle

Actually this gave me an error, but when changing it to:
<%= text_field_tag “email”, @cart.customer.email %>
it worked.
Still one last question: will rails know that I want to save that
email address in the orders table?
And also, trying to checkout, I now get an error:

There were problems with the following fields:
Email is invalid

… but the email is valid.
What is the problem then?

Elle

This gets an error:

TypeError in Cart#checkout
Showing app/views/cart/checkout.rhtml where line #17 raised:
can’t convert Symbol into String

17:

<%= text_field “order”, “email”, @cart.customer.email %></
p>

Elle

You’re using a text_field_tag, try specifying <%= text_field “order”,
“email”, @cart.customer.email %> instead.

On Jan 8, 2008 4:14 PM, elle [email protected] wrote:

Are you actually storing an email address with every order? Seems

<%= text_field :order, :email %>

Would Rails know to find that info? and would it still know where that
info should be stored?

Elle


Ryan B.

Feel free to add me to MSN and/or GTalk as this email.

Is there an @order instance variable defined?

What is the backtrace on that error?

On Jan 9, 2008 8:51 AM, elle [email protected] wrote:

I get:
On Jan 8, 4:59pm, elle [email protected] wrote:

Still one last question: will rails know that I want to save that

<%= text_field_tag "email", "#{customer.email}" %>


Ryan B.http://www.frozenplague.net
Feel free to add me to MSN and/or GTalk as this email.


Ryan B.

Feel free to add me to MSN and/or GTalk as this email.

If I use this version:
<%= text_field_tag “email”, @cart.customer.email %>
The email gets displayed and when I use debug to check type, the type
of @cart.customer.email is String.
But then I get an error that the email address is invalid, even though
it is.

If I use:
<%= text_field “order”, “email”, @cart.customer.email %>
I get:
TypeError in Cart#checkout
Showing app/views/cart/checkout.rhtml where line #17 raised:
can’t convert Symbol into String

Would anyone have a solution? or know what the problem is?

Thanks,
Elle

No @order instance. The order is created and populated once the user
clicks “process”.

Application trace is:
#{RAILS_ROOT}/vendor/rails/actionpack/lib/action_view/helpers/
form_helper.rb:162:in delete' #{RAILS_ROOT}/vendor/rails/actionpack/lib/action_view/helpers/ form_helper.rb:162:intext_field’
#{RAILS_ROOT}/app/views/cart/checkout.rhtml:18:in
`_run_rhtml_47app47views47cart47checkout46rhtml’

Is this any help?
Elle

Indeed it is, define @order = Order.new in the controller and it might
get
rid of your problem. What it’s trying to do is to find an order instance
variable with an email method on it, but maybe because you don’t have it
defined it’s throwing that error.

On Jan 9, 2008 11:22 AM, elle [email protected] wrote:

`_run_rhtml_47app47views47cart47checkout46rhtml’

Elle

Actually this gave me an error, but when changing it to:
… but the email is valid.

Then you can get the email from that user record.
Would Rails know to find that info? and would it still know

Ryan B.http://www.frozenplague.net
Feel free to add me to MSN and/or GTalk as this email.


Ryan B.

Feel free to add me to MSN and/or GTalk as this email.

This is my cart_controller#place_order:

def place_order
@page_title = “Checkout”
@order = Order.new(params[:order])
@order.customer_ip = request.remote_ip
@order.customer_id = @customer.id
@order.discount = @customer.discount
populate_order

 if @order.save
  if @order.process
    flash[:notice] = 'Your order has been submitted, and will be

processed immediately.’
session[:order_id] = @order.id
# Empty the cart
@cart.cart_items.destroy_all
redirect_to :action => ‘thank_you’
else
flash[:notice] = “Error while placing order.
‘#{@order.error_message}’”
render :action => ‘view_cart’
end
else
render :action => ‘checkout’
end
end

Should I define it in another place?

Elle

Between the two of us, I would be the stupid one, not you :slight_smile:
And I learn something new every day.
So, I can use :value to specify what shows in the field.

But I now have a new question: I have all the states in an array and I
use an iterator to print out all the states.
Now, I want the customer’s state to be pre-selected, so, my logic says
to use something like that:
states.each do | state | %>
<option value="<%= state %>"
<%= if state == @cart.customer.ship_to_state then puts
‘selected=“selected”’ end %> ><%= state %>
<% end %>
…but this doesn’t work. It just prints the normal list of states,
with none selected.
What should I change?

Elle

Bah! I’m stupid.

You should be specifying <%= text_field “order”, “email”, :value => @
cart.customer.email %> instead of:

<%= text_field “order”, “email”, @cart.customer.email %>

Be back later, banging my head against the desk.


Ryan

On 11 Jan 2008, at 04:08, elle wrote:

<option value="<%= state %>"
<%= if state == @cart.customer.ship_to_state then puts

‘selected=“selected”’ end %> ><%= state %>
<% end %>
…but this doesn’t work. It just prints the normal list of states,
with none selected.
What should I change?

Don’t use puts -
<%= if state == @cart.customer.ship_to_state then
‘selected=“selected”’ end %>
or even
<%= ‘selected=“selected”’ if state == @cart.customer.ship_to_state%>

But as it’s been said before there are helpers to take care of this.

Fred

Thanks guys and I agree about using a helper method. Would be
better… but I tried that before and because I don’t know enough
about rails just yet, I had trouble with it and resorted to this
solution.
How would you suggest I create a helper method?

Elle

On Jan 11, 10:25 pm, Frederick C. [email protected]

Why wouldn’t you do something along the lines of:

your_controller.rb

@some_states_and_provinces = [‘alabama’, ‘arkansas’, ‘canberra’, ‘new
south wales’].map{|s| [s,s]}
@selection = ‘canberra’

your_view.rhtml

<%= select(‘order’, ‘state’,
@some_states_and_provinces, :first, :first, @selection) %>

I don’t know what your fields are, but chances are there’s a Rails
helper to take care of your problem.