Добавление товаров в корзину с неправильным перенаправлением - PullRequest
1 голос
/ 01 сентября 2011

Я следил за этим 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" %>

edit - logs

Тестовая версия при добавлении элемента (рабочая):

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)

Не могу понять, зачем это нужночтобы перенаправить на индекс позиций, а не создавать, код тот же.

edit - маршруты

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

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

edit - взято из моего приложенияконтроллер

  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 Ответ

1 голос
/ 01 сентября 2011

Если вы добавляете товар в корзину, нажав на ссылку «Добавить в корзину», вам нужно будет вызвать действие create в контроллере LineItemsController, как оно есть у вас сейчас.

Последняя строка этого метода -

redirect_to current_cart_url

То есть вы действительно перенаправляете на текущую корзину так, как хотите, но говорите, что не перенаправляете на текущую корзину, что на самом деле бессмысленно.

Возможно, вы еще не настроили путь или представления 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, а не запрос get (link), и, следовательно, вы должны использовать форму (button_to даст вам эту форму ). Если вы не хотите загружать пауков ботов; / crawlers и т. Д. ... добавляя вещи в корзину, вы должны использовать

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