私にはわからない奇妙な問題があります。基本的に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
完全なフォームを投稿できますか? – Pavan
'bootstrap_nested_form_for'コマンドは繭を使用せず、' nested_form'を使用します。したがって、それらを混ぜ合わせないことが最善です。また、これらの宝石はどちらも古くなっているので、代わりに 'simple_form'を推奨します(ブートストラップサポートもあります)。 とにかく問題は 'cocoon'や' nested_form'(ネストされた属性を持つフォームを作る)とは関係ありませんが、あなたのルート定義(またはあなたのフォームurl)に関係しています。あなたは何をしようとしているのか説明できますか?あなたのフォームはurl = 'prop_order_update_patch_path(@properties、@orders)'ですので、オーダーの配列を渡したいと思うので、 'orders_id'です。 – nathanvda
宝石について知りたいことは面白いです、ありがとう。私は今では約6ヶ月間のレールでしかコーディングしていませんでした。そして、 'bootstrap_form_for'という宝石は、私が始めたときに最初に選んだもので、決して切り替えられなかったものでした。基本的に '@ orders'は' @ properites'に属しているので、 'order'を記入するために 'jQuery steps'プラグインを使って一連のフォームの'/properties /:property_id/orders /:order_id/prop_order_wiz'です。私がしようとしているのは、 'belongs_to Property'という新しい' deed'レコードに ':order_id'を渡し、最初の読み込み時にうまく動作しますが、検証が失敗した場合は上記の結果になります –