我的项目是关于一个在线购物网站,使用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。 有人可以帮我解决它!
答案 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
?当然,购物篮功能与您是否添加product
,phone
或其他任何内容无关?
我个人会做以下事情:
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。