根据要求,这就是我解决此问题的方法(使用数字输入字段)。
表格的相关部分:
<div id="package_products" class="col-xs-8">
<% @products.each do |product| %>
<div class="col-xs-4 field">
<%= hidden_field_tag 'product[][id]', product.id %>
<%= label_tag 'product[][name]', product.name %>
<%= number_field_tag 'product[][quantity]', {}, id: "product_" + product.id.to_s %>
</div>
<% end %>
</div>
还有我的包控制器代码(请注意,我手动填充字段以便能够添加非连接参数...不确定是否有更多的 Rails 方法可以做到这一点?)。也不确定我的解决方案的安全性,因为我没有包括在内product[:quantity]
在控制器底部的私有部分中的强参数中(不记得我的理由了)。从理论上讲,这意味着有人可以在数据库中插入恶意代码,但这不太可能,因为它是一个整数字段,并且只能由会自我破坏的管理员编辑。如果您要发布消费者应用程序,我会仔细检查其潜在影响:
def create
@package = Package.new(package_params)
@package_items = params[:product].delete_if { |product| !product[:quantity].present? || (product[:quantity]).to_i <= 0}
if @package.save
@package_items.each do |x|
packageitem = PackageItem.create(package_id: @package.id, product_id: x['id'], quantity: x['quantity'])
packageitem.save!
end
respond_to do |format|
flash.now[:notice] = "Package was successfully created!"
format.html { redirect_to packages_path }
format.json { head :no_content }
format.js
end
end
end
private
def set_products
@products = Product.all
end
def package_params
params.require(:package).permit(:name, :price, :package_image, :multiple_day_discount)
end
和 model/package_item.rb
class PackageItem < ActiveRecord::Base
belongs_to :package
belongs_to :product
end