[英]Rails route to update an associated model's attributes
我有一个Cart
, CartProduct
和Product
模型。 每当将产品添加到购物CartProduct
,代表购物车中商品的CartProduct
模型都会具有相应的属性quantity
。 当前,我正在Cart
上发送PATCH
请求,以更新Cart
的关联CartProduct
模型。
我的问题是:当我想更新购物车商品时,最好在CartProduct
模型中使用add_product
, remove_product
等方法,还是应该在Cart
模型中使用这些方法(下面的当前设置)正好)? 还是取决于个人喜好?
请注意,代码不完整。 我刚刚选择了这个问题的重要部分:
class Cart < ActiveRecord::Base
has_many :cart_products, inverse_of: :cart, dependent: :destroy
has_many :products, through: :cart_products, source: :product
def add_product(product_id) #directed here from PATCH request
#pulls the associated cart_product for this cart and updates
end
def remove_product(product_id) #directed here from PATCH request
end
end
class CartProduct < ActiveRecord::Base
belongs_to :cart, inverse_of: :cart_products
belongs_to :product, inverse_of: :cart_products
#or should add_product, remove_product methods go here instead?
end
class Product < ActiveRecord::Base
has_many :cart_products, inverse_of: :product, dependent: :destroy
has_many :carts, through: :cart_products, source: :cart
end
当用户增加购物车商品的数量时,实际上正在更新的是CartProduct
模型,而不是Cart
模型-因此这让我感到担心,因为我在Cart
上发送了PATCH
请求,而我认为这样做更有意义在CartProduct
模型上具有路线/方法,因为这是要更新的实际模型。
我认为您的要求将取决于个人喜好。
我的喜好是将其保留为您所拥有的名称,然后从Cart
模型中调用add_product
。
其他人可能建议创建一个全新的类,观察者等来处理这两个模型之间的关系,但是您最终要做的是使一个类依赖于两个模型,而不是保留您拥有的类而仅使一个模型方法依赖另一个模型的属性。
您混合了MVC中控制器和模型的功能。
模型是如何在应用程序中实现业务逻辑,以及如何将不同的对象捆绑在一起。 模型不应该对PUT,POST,PATCH有所了解,甚至不知道有当前请求,这也不是他们的工作。
因此,如果您要在模型中创建一种方法来处理特定种类的请求,那么您做错了。
控制器负责响应请求。 它们与路由一起构建您的应用程序公开的RESTful接口。
在这种情况下,究竟如何处理嵌套资源确实是一个问题。
为了清楚起见,我将使用更常见的术语订单项而不是CartProduct:
Prefix Verb URI Pattern Controller#Action
products GET /products(.:format) products#index
POST /products(.:format) products#create
product GET /products/:id(.:format) products#show
PATCH /products/:id(.:format) products#update
PUT /products/:id(.:format) products#update
DELETE /products/:id(.:format) products#destroy
cart_line_items GET /carts/:cart_id/line_items(.:format) line_items#index
POST /carts/:cart_id/line_items(.:format) line_items#create
line_item GET /line_items/:id(.:format) line_items#show
PATCH /line_items/:id(.:format) line_items#update
PUT /line_items/:id(.:format) line_items#update
DELETE /line_items/:id(.:format) line_items#destroy
carts GET /carts(.:format) carts#index
POST /carts(.:format) carts#create
cart GET /carts/:id(.:format) carts#show
PATCH /carts/:id(.:format) carts#update
PUT /carts/:id(.:format) carts#update
DELETE /carts/:id(.:format) carts#destroy
在许多情况下,使用嵌套属性和创建/更新/删除子记录是一个很好的解决方案-但它常常导致创建非常有限的动作集的诱惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.