-1

私にはわからない奇妙な問題があります。基本的にparams[:order_id]はフォームの送信時にparams[:orderS_id]になり、フォームが検証に失敗するとエラーが発生します。検証が失敗した後、Paramsはレンダリング時に複数/間違って表示されます

カスタムの編集/更新コントローラアクションを持つページでは、ネストしたフォームにコクーンを使用しています(これは、他のページの同じフォームとは異なり、成功した/失敗した送信を別の方法で制御する必要があるためです)。

params on page load

Started GET "/properties/99/orders/1/prop_order_wiz" for 127.0.0.1 at 
2017-08-20 17:33:41 -0400 
Processing by PropertiesController#prop_order_edit as HTML 
Parameters: {"property_id"=>"99", "order_id"=>"1"} 

params[:order_id]持つので、ページがロードさ期待して、私は次の形式で、この値を使用して:最初のレンダリング時に

deeds form

<%= bootstrap_nested_form_for(@properties, url: prop_order_update_patch_path(@properties, @orders), method: "patch", layout: :horizontal) do |f| %> 
    ... 

    ## Cocoon fields_for _deeds_fields.html.erb... ## 
    <%= f.hidden_field :order_id, value: params[:order_id] %> 
    ## end cocoon ## 
    ... 
    <%= f.submit "Save Deeds", class: "btn btn-primary inline pull-right" %> 
<% end %> 

ページとスクロールセクシーな提出、すべての問題はありません。ただし、フォームが検証に失敗した場合、ページはparams[:orders_id]でレンダリングされ、params[:order_id]は空白になり、エラーが発生します。

order_id => 1の代わりにorders_id => 1と提出する形式で提出されたparametersから、私はこれを知ることができます。私のコントローラのアクションで

form params(私が何を意味するかを見るためにすべての道を右にスクロール)

Parameters: {"utf8"=>"✓", "authenticity_token"=>"..", "property"=>{ "deeds_attributes"=>{"0"=>{"_destroy"=>"false", "property_id"=>"99", "order_id"=>"1", ..., "id"=>"1"}}}, "commit"=>"Save Deeds", "property_id"=>"99", "orders_id"=>"1"} 

それはparams[:order_id]をレンダリングするとき@properties.saveに失敗したが、後に、私はrender@orders = Order.find(params[:orders_id])と呼ぶことにします空白で、 params[:orderS_id]には正しい情報があります。

私はこれを最初の読み込み操作でparams[:orders_id] = params[:order_id]と呼び出すことで対処できましたが、これは正しい方法ではありません。誰でも私に教えてくださいなぜこれが起こるとどのようにそれを修正する?詳細については、以下のカスタムコントローラアクションを含めます。前もって感謝します!

カスタムコントローラアクション

def prop_order_edit ## Initial page load 
    @properties = Property.find(params[:property_id]) 
    @orders = @properties.orders.find(params[:order_id]) 
    params[:orders_id] = params[:order_id] ## temp fix ## 
    render 'orders/orderprocess/prop_order_wiz' 
end 

def prop_order_update ## Custom update action for form submission 
    @properties = Property.find(params[:property_id]) 
    @orders = Order.find(params[:orders_id]) ## modified for temp fix 
    @properties.update_attributes(property_params) 
    respond_to do |format| 
    format.html { 
        if @properties.save 
        flash[:success] = "Order Updated Successfully" 
        redirect_to prop_order_wiz_path(@properties, @orders) 
        else 
        @orders = Order.find(params[:orders_id]) ## modified for temp fix 
        render 'orders/orderprocess/prop_order_wiz' 
        end 
       } 
    format.js { 
       if @properties.save 
        flash[:success] = "Order Updated Successfully" 
       else 
        @orders = Order.find(params[:orders_id]) ## modified for temp fix 
        flash.now[:danger] = "Unable to Update Order" 
        render 'orders/orderprocess/prop_order_wiz' 
       end 
      } 
    end 
end 
+0

完全なフォームを投稿できますか? – Pavan

+0

'bootstrap_nested_form_for'コマンドは繭を使用せず、' nested_form'を使用します。したがって、それらを混ぜ合わせないことが最善です。また、これらの宝石はどちらも古くなっているので、代わりに 'simple_form'を推奨します(ブートストラップサポートもあります)。 とにかく問題は 'cocoon'や' nested_form'(ネストされた属性を持つフォームを作る)とは関係ありませんが、あなたのルート定義(またはあなたのフォームurl)に関係しています。あなたは何をしようとしているのか説明できますか?あなたのフォームはurl = 'prop_order_update_patch_path(@properties、@orders)'ですので、オーダーの配列を渡したいと思うので、 'orders_id'です。 – nathanvda

+0

宝石について知りたいことは面白いです、ありがとう。私は今では約6ヶ月間のレールでしかコーディングしていませんでした。そして、 'bootstrap_form_for'という宝石は、私が始めたときに最初に選んだもので、決して切り替えられなかったものでした。基本的に '@ orders'は' @ properites'に属しているので、 'order'を記入するために 'jQuery steps'プラグインを使って一連のフォームの'/properties /:property_id/orders /:order_id/prop_order_wiz'です。私がしようとしているのは、 'belongs_to Property'という新しい' deed'レコードに ':order_id'を渡し、最初の読み込み時にうまく動作しますが、検証が失敗した場合は上記の結果になります –

答えて

0

これは、プロパティとの関係がモデルと注文モデルがフォームを送信する際、複数のparamを生成しますhas_manyのあることのように見えます。 プロパティに1つの注文のみがある場合は、その関係をhas_oneに変更する必要があります。次にorder_idに変更する必要があります。

+0

あなたは絶対正しいです、** Property **は 'has_many:orders'であり、** Order **はそれらの関連に対して' belongs_to'です。私はparamsに違いがあるかどうか分からなかったので、あなたがそれをキャッチしてうれしいです。状況を直す最善の方法は何でしょうか? –

+0

明確にするために、 'Property'は多くの注文を持つことができます。 –

関連する問題