使用单选按钮更新找到的设置

时间:2013-10-01 17:38:55

标签: ruby-on-rails-3 forms

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

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

我觉得首选的布尔值更有吸引力,因此当用户重复签出过程时,会向他/她显示首选地址。但问题在于改变这个首选属性。

简而言之,需要创建一个单选按钮,以便在表单中设置首选项为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| %>

1 个答案:

答案 0 :(得分: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

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