Rails 4电子商务应用程序使用collection_select / select:如何正确实现?

时间:2014-04-10 06:11:56

标签: ruby-on-rails activerecord collection-select

我有一个包含以下列的产品型号:

name:string
price:integer

我还有一个购物车模型,line_item模型,一个订单控制器:非常基本,但你明白了。

我需要做的(并且已经完成)是为产品型号添加尺寸(因为它适用于T恤)和颜色。很公平,

rails g migration AddSizeToProducts size:string

效果很好,颜色相似。

购买流程的设置方式如下:

  1. 选择衬衫(一页)

  2. 选择衬衫后
  3. ,带您到下一页

  4. 在此页面上,您将选择衬衫的颜色和尺寸。

  5. 根据我收集的内容,使用select不会与数据库绑定,所以我认为collection_select在这里更合适?或者这样的事情会好吗?

    <%= select @product, :id, [ ["Small",1], ["Medium",2], ["Large",3]] %>
    

    此外,我如何“预填充”这些字段的大小,即小/中/大和颜色,即黑/蓝/白,而不选择产品之前与特定产品相关联(从上面的步骤1开始)?< / p>

    对此事的任何意见表示赞赏。

1 个答案:

答案 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