在控制器之前执行视图?

时间:2016-02-29 05:59:09

标签: ruby-on-rails ruby-on-rails-4

刚开始学习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

1 个答案:

答案 0 :(得分:2)

您通过此链接将产品ID发送到购物车的创建方法。

 = link_to 'Add', shopping_cart_path(:product_id => product.id), :method => 'POST'
i class="fa fa-cart-plus"

在这里发送product_id。您可以通过参数在控制器中使用。

您的控制器应更改为,

&#13;
&#13;
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;
&#13;
&#13;

如果您选择 params[:product_id] ,您将获得所选产品的ID以添加到购物车中,您可以使用该ID创建。