Ruby on Rails - 具有嵌套属性的重复记录

时间:2018-01-10 20:11:34

标签: ruby-on-rails ruby ruby-on-rails-5

在我的结帐页面上,我正在加载一个包含两个地址的表单。一个用于计费,另一个用于运输。我将这些设置作为购物车对象的嵌套属性。当用户创建/更新其地址时,我的控制器操作中的代码执行如下:

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值中使用硬编码。对我来说,这似乎是一个糟糕的方法,但我不知道如何检查参数,然后根据需要改变。我已经做了一些搜索,但我见过的任何东西都没有向我指明任何方向。

任何指导都将不胜感激。提前致谢。

0 个答案:

没有答案