[英]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.