0

上下文是一个结帐过程,用户可以从她/他的送货地址中挑选。因此,控制器动作状态:

@shipping_addresses = ShippingAddress.where(['user_id = ?',  current_user.id])

我发现为首选设置一个布尔值更有吸引力,这样当用户重复结帐过程时,她/他会看到首选地址。但问题在于改变这个首选属性。

简而言之,需要创建一个单选按钮以在表单中将preferred设置为true(无论如何都要选择,取消其他按钮?)然后表单需要更新记录

  def update_preferred
    respond_to do |format|
    if @shipping_addresses.save
    @shipping_addresses = ShippingAddress.where(['user_id = ?',  current_user.id]).update_all("preferred = 'false'")
    -- selected_shipping_address.update("preferred = 'true'")
  end

..也很难使用声明表单的语法(因为我从未远离标准的 Rails 约定......):

<%= form_for(@shipping_addresses) do |f| %>
4

1 回答 1

0

一种可行的解决方案。在表单中,包括单选按钮,它只允许用户选择一个:

<%= radio_button_tag "shipping_address_id", shipping_address.id %>
<%= submit_tag "update" %>

使用定义的动作路线,在控制器中包含方法,该方法首先将所有找到的集合设置为 false,然后将选定的 shipping_address 设置为 true。

  def update_preferred
    @shipping_address = ShippingAddress.find(params[:shipping_address_id])
    @shipping_addresses = ShippingAddress.where(['user_id = ?',  current_user.id]).update_all("preferred = 'false'")
    @shipping_address.update_column(:preferred, "true")

    respond_to do |format|
      if @shipping_address.update_attributes(params[:shipping_address])
        format.html { redirect_to cart_url(session[:cart_id]), notice: 'Shipping address was successfully updated.' }
      else
        format.html { redirect_to cart_url(session[:cart_id]), notice: 'Shipping address was not updated.' }
      end
    end
  end

也许这可以更简化。欢迎评论。

于 2013-10-02T09:16:40.810 回答