在我的结帐页面上,我正在加载一个包含两个地址的表单。一个用于计费,另一个用于运输。我将这些设置作为购物车对象的嵌套属性。当用户创建/更新其地址时,我的控制器操作中的代码执行如下:
def update_addresses
@countries = Country.all
@states = State.all
@cart = Cart.find(params[:cart][:id])
if params[:cart][:cart_addresses_attributes]["0"][:address_type] == "Billing" && params[:cart][:cart_addresses_attributes]["1"][:address_type] == "Shipping"
bla = @cart.cart_addresses.find_by(address_type: "Billing")
spa = @cart.cart_addresses.find_by(address_type: "Shipping")
if (params[:cart][:cart_addresses_attributes]["0"][:id].blank?) && !(bla.blank?)
params[:cart][:cart_addresses_attributes]["0"][:id] = bla.id
end
if (params[:cart][:cart_addresses_attributes]["1"][:id].blank?) && !(spa.blank?)
params[:cart][:cart_addresses_attributes]["1"][:id] = spa.id
end
@cart.update(params.require(:cart).permit(cart_addresses_attributes: [:id, :address_type, :first_name, :last_name, :email, :telephone, :address_line_one, :address_line_two, :city, :zip_code, :country, :state]))
#more code to render response here
end
更新后,浏览器发布带有id属性的表单数据,一切正常。在创建时,浏览器发布没有id的表单数据,并创建地址记录。
我有几个实例,用户在创建地址之前在我的结帐页面上打开了2个浏览器窗口,在他们第一次创建地址后,用户返回到他们尚未创建的页面地址。第二页仍然有创建记录的形式(不更新以前创建的记录。这导致2个送货地址和2个帐单地址错误。
所以,我添加了这些代码行来检查这种情况,并将id param设置为先前创建的id(如果已经存在的话)。
bla = @cart.cart_addresses.find_by(address_type: "Billing")
spa = @cart.cart_addresses.find_by(address_type: "Shipping")
if (params[:cart][:cart_addresses_attributes]["0"][:id].blank?) && !(bla.blank?)
params[:cart][:cart_addresses_attributes]["0"][:id] = bla.id
end
if (params[:cart][:cart_addresses_attributes]["1"][:id].blank?) && !(spa.blank?)
params[:cart][:cart_addresses_attributes]["1"][:id] = spa.id
end
这很好用,但正如你所看到的,我不得不在代码中的param值中使用硬编码。对我来说,这似乎是一个糟糕的方法,但我不知道如何检查参数,然后根据需要改变。我已经做了一些搜索,但我见过的任何东西都没有向我指明任何方向。
任何指导都将不胜感激。提前致谢。