刚开始学习rails。我正在建立我的第一家电子商店。
我的页面products/index
列出了我的产品。这是视图(在Slim中):
- @products.each do |product|
br
.ul class='list-group'
li class="list-group-item row"
.textlist class="col-lg-10 col-md-10 col-sm-10 col-xs-9"
.element_products
h4 <b>Category :</b> #{product.category}
.element_products
h4 <b>Description :</b> #{product.content}
.element_products
h4 <b>Price :</b> #{product.price} euros
button class='btn btn-primary btn-right' class="col-lg-1 col-md-1 col-sm-2 col-xs-3"
p <b>Add to Cart</b>
= link_to 'Add', shopping_cart_path(:product_id => product.id), :method => 'POST'
i class="fa fa-cart-plus"
此代码使用this gem for the shopping cart。我试图获取产品/索引中的产品列表,并使用按钮将商品添加到购物车。
这里的重要部分是我在我的产品表(第1行)上做了#each。 我有一个产品控制器,如下:
class ProductsController < ApplicationController
def index
@user = User.find(session[:user_id])
@products = Product.all
@product = Product.new
end
[...]
end
这是我的购物车控制器:
class ShoppingCartsController < ApplicationController
before_filter :extract_shopping_cart
def create
@product_cart = Product.find(@product_id)
@shopping_cart.add(@product_cart, @product_cart.price)
redirect_to shopping_cart_path
end
def show
end
private
def extract_shopping_cart
shopping_cart_id = session[:shopping_cart_id]
@shopping_cart = session[:shopping_cart_id] ?
ShoppingCart.find(shopping_cart_id) : ShoppingCart.create
session[:shopping_cart_id] = @shopping_cart.id
end
end
问题:
在我看来,我使用.each
来显示Product表中的所有产品。
要创建新产品,我需要在控制器@product_cart
第5行定义ShoppingCartsController
(我要添加到购物车的产品)。
现在我把它定义为:
@product_cart = Product.find(@product_id)
每次执行视图中的@product_id
循环时, .each
都会增加,因此我可以Product.find(1)
,然后Product.find(2)
,然后Product.find(3)
。 。
但我无法使用@products.each
循环执行此操作,因为在视图中使用此循环来显示所有产品。视图在控制器之后执行。
有没有办法在我的视图中使用@product_id
循环增加.each
,然后@product_id
中的控制器使用Products#create
?
答案 0 :(得分:2)
您通过此链接将产品ID发送到购物车的创建方法。
= link_to 'Add', shopping_cart_path(:product_id => product.id), :method => 'POST'
i class="fa fa-cart-plus"
在这里发送product_id
。您可以通过参数在控制器中使用。
您的控制器应更改为,
class ShoppingCartsController < ApplicationController
before_filter :extract_shopping_cart
def create
@product_cart = Product.find(params[:product_id])
@shopping_cart.add(@product_cart, @product_cart.price)
redirect_to shopping_cart_path
end
def show
end
private
def extract_shopping_cart
shopping_cart_id = session[:shopping_cart_id]
@shopping_cart = session[:shopping_cart_id] ?
ShoppingCart.find(shopping_cart_id) : ShoppingCart.create
session[:shopping_cart_id] = @shopping_cart.id
end
end
&#13;
如果您选择 params[:product_id]
,您将获得所选产品的ID以添加到购物车中,您可以使用该ID创建。