如何在rails 4中创建Shop网站模型的篮子?

时间:2016-01-07 12:59:03

标签: ruby-on-rails ruby

我的项目是关于一个在线购物网站,使用Ruby on Rails购买手机。 我的数据库是用户,产品,电话。 我试图创建篮子模型。

我的路线:

resources :products do
    resources :phone do
      resources :baskets
    end
end

我的代码是:

class User < ActiveRecord::Base
    has_many :baskets
end

class Phone < ActiveRecord::Base
   belongs_to :product
   has_many :baskets
end

class Basket < ActiveRecord::Base
   belongs_to :user
   belongs_to :phone
end

当我在产品的Show动作中,它显示本产品的产品名称和索引电话时,我想将1个电话添加到购物篮,错误是:

No route matches {:action=>"new", :controller=>"baskets", :id=>"38", :product_id=>"30"} missing required keys: [:phone_id]

我认为问题是:

http://localhost:3000/products/30/phone/38

它的Product_id = 30,但不是Phone_id = 30,这里只是Id = 30。 有人可以帮我解决它!

2 个答案:

答案 0 :(得分:2)

resources :products do
  resources :phone do
    resources :baskets
  end
end

意味着你必须有这样的路线:

/products/:product_id/phones/:phone_id/baskets/:basket_id(.:format)

这意味着,link_to中您应该传递phone_id

link_to 'show basket' product_phone_basket_path(product_id: @product.id, phone_id: @phone.id, basket_id: @basket.id)
link_to 'New basket' new_product_phone_basket_path(product_id: @product.id, phone_id: @phone.id)

答案 1 :(得分:1)

无论您是否正常工作(我赞成@Andrey的答案),您都希望咨询您的路由结构。

  

资源不应该嵌套超过1级深度。 docs

-

在您的情况下,我很好奇为什么phones嵌套在products内。当然,手机产品?

此外,为什么要包括resources :baskets?当然,购物篮功能与您是否添加productphone或其他任何内容无关?

我个人会做以下事情:

resources :products, only: [:index, :show] do
   resources :basket, path:"", module: :products, only: [:create, :destroy] #-> url.com/products/:product_id/
end

#app/controllers/products/basket_controller.rb
class Products::BasketController < ApplicationController
   before_action :set_product

   def create
      # add to cart
   end

   def destroy
      # remove from cart
   end

   private

   def set_product
      @product = Product.find params[:product_id]
   end
end

我在(here)之前实施了购物车(基于会话)。

如果你愿意,我可以给你代码;除非你想要它,否则我不会把它放在这里。它基于此Railscast