我有一个包含以下列的产品型号:
name:string
price:integer
我还有一个购物车模型,line_item模型,一个订单控制器:非常基本,但你明白了。
我需要做的(并且已经完成)是为产品型号添加尺寸(因为它适用于T恤)和颜色。很公平,
rails g migration AddSizeToProducts size:string
效果很好,颜色相似。
购买流程的设置方式如下:
选择衬衫(一页)
,带您到下一页
在此页面上,您将选择衬衫的颜色和尺寸。
根据我收集的内容,使用select
不会与数据库绑定,所以我认为collection_select
在这里更合适?或者这样的事情会好吗?
<%= select @product, :id, [ ["Small",1], ["Medium",2], ["Large",3]] %>
此外,我如何“预填充”这些字段的大小,即小/中/大和颜色,即黑/蓝/白,而不选择产品之前与特定产品相关联(从上面的步骤1开始)?< / p>
对此事的任何意见表示赞赏。
答案 0 :(得分:1)
没有将它们与特定产品相关联
这让我很困惑 - 当然你想要将选择框与特定产品的选项相关联?
我个人会确保设置“购买流程”以传递产品ID。我是通过使用nested resource in the routes:
来完成的#config/routes.rb
resources :products do
get :step2 #-> /products/1/step2
end
这将通过params[:product_id]
整个过程,允许您在下一步使用它:
#app/controllers/products_controller.rb
def step2
@product = Product.find(params[:product_id])
end
#app/views/products/step2.html.erb
<%= collection_select(:product, :size_id, @product.size, :id, :name, prompt: true) %>
看了之后,我认为您真正的问题是将size
作为字符串存储在Product
模型中。我创建了一个名为sizes
的单独模型,然后使用名为products_sizes
的连接模型,允许您根据需要为每个产品关联尽可能多的尺寸。然后,您就可以调用关联数据
为什么不这样做:
#app/models/product.rb
Class Product < ActiveRecord::Base
has_many :product_sizes
has_many :sizes, through: :product_sizes
end
#app/models/size.rb
Class Size < ActiveRecord::Base
has_many :product_sizes
has_many :products, through: :product_sizes
end
#app/models/product_size.rb
Class ProductSize < ActiveRecord::Base
belongs_to :product
belongs_to :size
end
这允许您存储许多不同产品的尺寸,允许您从ProductSize
模型中选择ID,并直接在购物车模型中引用它们:
#app/models/cart.rb
Class Cart < ActiveRecord::Base
belongs_to :user
belongs_to :product
belongs_to :product_size
end
#carts
id | user_id | product_id | product_size_id | created_at | updated_at
这意味着如果您创建新的购物车项目,则可以直接为记录分配product
的{{1}}:
size