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

..フォームを宣言するための構文にも苦労しています(私は標準的なレールの慣習から離れたことは一度もありません...):

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

1 に答える 1

0

1 つの実用的なソリューション。フォームに、ユーザーが 1 つのみ選択できるようにするラジオ ボタンを含めます。

<%= 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 に答える