上下文是一个结帐流程,用户可以从她/他的送货地址中选择。因此,控制器动作表明:
@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| %>
答案 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
也许这可以简化得更多。欢迎评论。