所以我有一个奇怪的问题,我似乎无法弄明白。基本上,params[:order_id]
在表单提交时变为params[:orderS_id]
,如果表单验证失败,则会导致错误。
我在具有自定义编辑/更新控制器操作的页面上使用cocoon用于嵌套表单(因为我需要控制在此页面上成功/失败提交的内容与在其他页面上的相同表单上提交的内容不同)。
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]
留空,然后会导致错误。
我可以通过以parameters
提交的表单提交的以下orders_id => 1
来告知,而不是order_id => 1
,为什么会发生这种情况?
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"}
在我的控制器操作中,我@orders = Order.find(params[:orders_id])
在render
失败后调用@properties.save
,但是当呈现params[:order_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
来解决此问题,但这似乎不是正确的方法。任何人都可以告诉我为什么这种情况发生并且如何来修复它?我将在下面提供我的自定义控制器操作以获取详细信息。提前谢谢!
自定义控制器操作
{{1}}
答案 0 :(得分:0)
看起来 Property 模型与 Order 模型之间的关系是has_many,它会在提交表单时生成多个参数。 如果该属性只有一个订单,您需要将关系更改为has_one,然后您需要将订单更改为订单,然后您可以使用order_id。