将项目添加到重定向错误的购物车

时间:2011-08-31 21:27:25

标签: ruby-on-rails activemerchant railscasts

我一直关注this Railscast在新的测试应用中实施Active Merchant并且进展顺利,但现在我正在尝试将我对主应用程序所做的内容添加到其中。

点击我的测试应用中的“添加到购物车”时,它会重定向到当前购物车并按预期列出该项目。

在我的主应用上点击添加到购物车链接重定向到:

http://mainapp.dev/line_items?product_id=1

line_items控制器如下所示:

class LineItemsController < ApplicationController
  def create
    @product = Product.find(params[:product_id])
    @line_item = LineItem.create!(:cart => current_cart, :product => @product, :quantity => 1, :unit_price => @product.price)
    flash[:notice] = "Added #{@product.name} to cart."
    redirect_to current_cart_url
  end
end

“添加到购物车”链接如下所示:

<%= link_to "Add to Cart", line_items_path(:product_id => product), :method => :post, :class => "product_actions" %>

编辑 - 记录

添加项目(工作)的测试版本:

Started POST "/line_items?product_id=5" for 127.0.0.1 at 2011-09-01 07:33:27 +0100
  Processing by LineItemsController#create as HTML
  Parameters: {"authenticity_token"=>"li7gkjksc9MENevuGz7emDwnbB6HrvPAE3CY=", "product_id"=>"5"}
  [1m[35mProduct Load (0.4ms)[0m  SELECT `products`.* FROM `products` WHERE `products`.`id` = 5 LIMIT 1
  [1m[36m (33.1ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (179.4ms)[0m  INSERT INTO `carts` (`created_at`, `purchased_at`, `updated_at`) VALUES ('2011-09-01 06:33:28', NULL, '2011-09-01 06:33:28')
  [1m[36m (48.3ms)[0m  [1mCOMMIT[0m
  [1m[35m (0.2ms)[0m  BEGIN
  [1m[36mSQL (0.2ms)[0m  [1mINSERT INTO `line_items` (`cart_id`, `created_at`, `product_id`, `quantity`, `unit_price`, `updated_at`) VALUES (29, '2011-09-01 06:33:29', 5, 1, 250, '2011-09-01 06:33:29')[0m
  [1m[35m (0.5ms)[0m  COMMIT
Redirected to http://sell.dev/cart
Completed 302 Found in 1265ms


Started GET "/cart" for 127.0.0.1 at 2011-09-01 07:33:29 +0100
  Processing by CartsController#show as HTML
  [1m[36mCart Load (0.2ms)[0m  [1mSELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 29 LIMIT 1[0m
  [1m[35mLineItem Load (0.3ms)[0m  SELECT `line_items`.* FROM `line_items` WHERE `line_items`.`cart_id` = 29
  [1m[36mProduct Load (0.5ms)[0m  [1mSELECT `products`.* FROM `products` WHERE `products`.`id` = 5 LIMIT 1[0m
Rendered carts/show.html.erb within layouts/application (202.1ms)
Rendered layouts/_header.html.erb (0.8ms)
Rendered layouts/_footer.html.erb (0.7ms)
Completed 200 OK in 368ms (Views: 284.2ms | ActiveRecord: 79.5ms)

主要应用版本:

Started GET "/line_items?product_id=1" for 127.0.0.1 at 2011-09-01 07:34:59 +0100
  Processing by LineItemsController#index as HTML
  Parameters: {"product_id"=>"1"}
Rendered line_items/index.html.erb within layouts/application (0.3ms)
Rendered layouts/_header.html.erb (1.3ms)
Rendered layouts/_footer.html.erb (178.4ms)
Completed 200 OK in 218ms (Views: 182.3ms | ActiveRecord: 35.5ms)

我无法弄清楚为什么它想要重定向到订单项索引而不是创建,代码是相同的。

编辑 - 路线

  get "cart" => "carts#show", :as => "current_cart"

  resources :orders
  resources :line_items
  resources :carts    
  resources :products
  resources :order_transactions

编辑 - 取自我的应用程序控制器

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def current_cart
    if session[:cart_id]
      @current_cart ||= Cart.find(session[:cart_id])
      session[:cart_id] = nil if @current_cart.purchased_at
    end
    if session[:cart_id].nil?
      @current_cart = Cart.create!
      session[:cart_id] = @current_cart.id
    end
    @current_cart
  end

感谢任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

如果您通过单击“添加到购物车”链接将项目添加到购物车,则需要在LineItemsController控制器中调用创建操作,就像现在一样。

该方法的最后一行是

redirect_to current_cart_url

所以你确实按照自己的意愿重定向到current_cart,但是你说你没有重定向到当前的购物车,这实际上是胡说八道。

也许您尚未设置current_cart_url路径或视图或其他内容?

我不清楚你的实际问题是什么

Started GET "/line_items?product_id=1" for 127.0.0.1 at 2011-09-01 07:34:59 +0100
  Processing by LineItemsController#index as HTML
  Parameters: {"product_id"=>"1"}
Rendered line_items/index.html.erb within layouts/application (0.3ms)
Rendered layouts/_header.html.erb (1.3ms)
Rendered layouts/_footer.html.erb (178.4ms)
Completed 200 OK in 218ms (Views: 182.3ms | ActiveRecord: 35.5ms)

此后必须发生一些事情! 〜这是什么?

编辑 - 解决方案 对不起,我完全错过了显而易见的事。

<%= link_to "Add to Cart", line_items_path(:product_id => product), :method => :post, :class => "product_actions" %>

发出请求请求,而不是日志文件Started GET "/cart" for 127.0.0.1 at 2011-09-01 07:33:29 +0100

指示的帖子请求

您正在向购物车添加商品,这意味着您正在更改服务器上的状态,这意味着您应该使用POST请求而不是获取(链接)请求,因此您应该使用表单(button_to将为您提供该表单)。除非您需要装载机器人的蜘蛛; /爬行器等......将东西添加到您的购物车中,您应该使用

<%= button_to 'Add to Cart', line_items_path(:product_id => product) %>