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
