Unless, I am not seeing the whole picture here, this is my guess:

You are calling current_order?, which is neither a method or variable.   In
your protected method (check_for_existing_order), you are capturing ALL
exceptions (generally a bad idea) with the follwing: rescue => exception.
 So you are capturing a method_missing or variable does not exist exception
(sorry I forget the proper name).  Try removing your rescue block, and see
what error bubbles to the top.  My guess is that current_order? does not
exist.

Even if I am wrong, you will find more information if you remove the
exception handling.  If I am correct, you can still capture an exception,
but do not cast your net so wide, so to speak!

Cheers

Ben W


On Thu, Dec 29, 2011 at 9:43 AM, Ylan Segal <[email protected]> wrote:

> Sure. Here we go:
>
> #config/session_store.rb
> Locum::Application.config.session_store :cookie_store, :key =>
> '_locum_session'
>
> #ApplicationController.rb
>  def current_order
>    if session[:order_id]
>      current_order = Order.find(session[:order_id])
>    end
>    if session[:order_id].nil?
>      current_order = Order.new
>    end
>    current_order
>  end
>
>  def current_order?
>    session[:order_id]
>  end
>
> #OrdersController (inherits from Application Controller)
>  before_filter :check_for_existing_order, :except => :except => [:add_item]
>
>  # Users cannot see any other action on the app until they have gone
> through add_item.
>  def add_item
>    @order = current_order
>    @order.save
>    session[:order_id] = @order.id
>    variant = Variant.where(:sku => params[:variant_sku]).first
>    quantity = params[:quantity].to_i
>    @order.add_item(variant, quantity) unless variant.nil?
>    redirect_to order_path
>  end
>
>  def show
>    @order = current_order
>  end
>
>  def update
>    @order = current_order
>    @order.attributes = params[:order]
>    if @order.save
>      flash[:notice] = 'Your cart has been updated successfully'
>    else
>      flash[:alert] = "Your cart could not be updated:
> #{@order.errors.full_messages.join(',')}"
>    end
>    redirect_to order_path
>  end
>
>  protected
>  # This is where I am caching the exceptions.
>  def check_for_existing_order
>    unless current_order?
>      begin
>        raise "Expecting to have order, but session doesn't have one"
>      rescue => exception
>        ExceptionNotifier::Notifier.exception_notification(request.env,
> exception).deliver
>      ensure
>        redirect_to root_path unless Rails.env.development?
>        return
>      end
>    end
>  end
>
> #config/routes.rb
>  resource :order, :except => [:destroy] do
>      member do
>        get :checkout
>        post :add_item
>      end
>    end
>
> I added the important parts (I think). Thanks for the help!
>
> --
> Ylan Segal
> [email protected]
>
> On Dec 29, 2011, at 9:24 AM, Ben Wanicur wrote:
>
> > Can you post your code Ylan ?  Also, can you include and session store
> config files as well ?
> >
> > On Thu, Dec 29, 2011 at 9:21 AM, Ylan Segal <[email protected]> wrote:
> > Fellow Rubyists,
> >
> > I have been scratching my head on this one for a while: I have an
> e-commerce app in production with pretty standard add-to-cart
> functionality. Whenever a user starts an order, I add the order id to the
> session and read it back on subsequent requests (like showing the cart,
> checkout form, etc). By and large, this works as expected in my tests and
> testing with local browsers.
> >
> > However, for a small number of my users, the session doesn't seems to
> keep the order id. In actions where I would expect the order id to be
> there, it is not. For example, I have a OrdersController#update action
> that, well, updates the order. Following convention, that actions forwards
> to OrdersController#show. Since the session[:order_id] was present in
> #update, I would obviously expect it to be set in #show, and for most users
> it is, but for some it is not. I am obviously, checking that the user is
> not visiting #show before #update or #create has been called.
> >
> > Random stuff that I think might make a difference
> >
> > * It is not restricted to any one browser/version. It happens with IE,
> Firefox, etc.
> > * It happens with browsers that have cookies (I can see when analyzing
> requests, that the cookies headers are being sent, it just that the session
> doesn't contain the expected variable/value).
> > * Running Rails 3.1 on heroku with default session store.
> >
> > Currently, my only hunch is that the users browser is not sending the
> latest version of a cookie (with the order_id set in the session) but the
> original one generated when the first visited the site (where the
> session[:order_id] has not been set).
> >
> > Has anyone experiences something like this? Would using another kind of
> cookie store solve this?
> >
> > Thanks for the help,
> >
> > --
> > Ylan Segal
> > [email protected]
> > Tel: +1-858-224-7421
> > Fax: +1-858-876-1799
> >
> > --
> > SD Ruby mailing list
> > [email protected]
> > http://groups.google.com/group/sdruby
> >
> >
> > --
> > SD Ruby mailing list
> > [email protected]
> > http://groups.google.com/group/sdruby
>
> --
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/group/sdruby
>

-- 
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby

Reply via email to