2017-05-17 3 views
0

私は、ユーザーが配送オプションを選択するページを私のアプリケーション上に持っています。私は彼らの選択肢をデータベースのorder.totalに追加する必要があります。モデルメソッドをsimple_formで呼び出すレールで送信

def update_order_from_shipping_page(shipping) 
    new_total = self.total + self.shipping 
    self.update_attributes(total: new_total) 
end 

そして、私の見解では次の形式::私は、次のカスタムorder.rbモデル内のメソッド持って

%= simple_form_for @order, url: charges_update_order_path(:shipping), method: :post do |f| %> 
    <div class="row"> 
     <div class="form-inputs text-left"> 
     <div class="form-group col-sm-6"> 
      <%= f.collection_radio_buttons :shipping, shipping_choices, :first, :last, item_wrapper_class: :block_radio_button_collection %> 
     </div> 
     </div> <!-- form inputs --> 
    </div> <!-- choices row --> 
    <div class="row"> 
    <%= f.button :submit, "Calculate Shipping" %> 
    </div> 
    <% end %> 

をそして、私は次のルートに作成している:私は持っている

post 'charges/update_order' 

をこれは私のですcharges_controller

def update_order 
    @order = current_order 
    if @order.update_order_from_shipping_page(shipping) 
     redirect_to new_charge_path and return 
    else 
     redirect_to :back 
     flash[:notice] = "Something is amuck." 
    end 
    end 

ラジオボタンが正しくポピュレートされ、コンソールエラーまたはサーバーエラーは表示されませんが、charges#newページに表示される合計には、モデルメソッドによってトリガされた更新が反映されません。誰かが私が間違っているのを見ることができますか?

+0

アクションを作成して送信します。 http://stackoverflow.com/a/7507925/4643970 –

+0

@MahmoudSayed、参考にしていただきありがとうございます!私はOPを大幅に更新しましたが、モデルメソッドが有効になっているのを見ていません。 – Liz

答えて

1

あなたのメソッドは、パラメータ(shipping)を受信するが、それはそれを使用していません。

def update_order_from_shipping_page(shipping) 
    new_total = self.total + self.shipping 
    self.update_attributes(total: new_total) 
end 

new_totalself.totalself.shippingを追加し、代わりのshippingを追加しています。したがって、self.shippingに既にデータが含まれていない限り、何も追加されません。それは、アカウントshippingを考慮されておらず、totalへの更新は行われません

@order.update_order_from_shipping_page(shipping) 

:あなたがそのメソッドを呼び出した結果

、。それを修正する

、それはshipping代わりのself.shippingが追加されますので、update_order_from_shipping_page方法を変更します。

def update_order_from_shipping_page(shipping) 
    new_total = self.total + shipping 
    self.update_attributes(total: new_total) 
end 

UPDATE

Array can't be coerced into BigDecimalを回避するには、オプションから正しい値を取得する必要がありますArrayを入力し、Integer/Floatに変換します。その更新をあなたのコントローラのupdate_order方法を達成するために:

def update_order 
    @order = current_order 
    shipping = params[:order][:shipping].gsub(/[$,]/,""​).to_f # new line added 

    if @order.update_order_from_shipping_page(shipping) 
    redirect_to new_charge_path and return 
    else 
    redirect_to :back 
    flash[:notice] = "Something is amuck." 
    end 
end 
  • gsub(/[$,]/,""​)

  • to_fFloatStringを変換する通貨文字($,)を削除することです。

+0

優れたキャッチ!残念ながら、 'ArrayはBigDecimalに強制変換できません 'というメッセージが表示されるようになりました。なぜなら、私はすべての配送オプションを与えるビューで':shipping'を渡しているからです。フォーム上でユーザーが選択した値の値を渡すにはどうすればよいですか? – Liz

+0

@ Liz if @ order.update_order_from_shipping_page(shipping) 'に' shipping'の値をどのように設定していますか? – Gerry

+0

完全なフォームはOPにありますが、現在は '<%= simple_form_for @order、url:charges_update_order_path(:shipping)、メソッド::post do | f | %> '...私が知っているのは正しいとは言えませんが、フォームで選択した値を取得する方法がわかりません... – Liz

関連する問題