验证失败后,参数在渲染时变为复数/不正确

时间:2017-08-20 23:10:01

标签: ruby-on-rails parameters ruby-on-rails-5 nested-forms cocoon-gem

所以我有一个奇怪的问题,我似乎无法弄明白。基本上,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}}

1 个答案:

答案 0 :(得分:0)

看起来 Property 模型与 Order 模型之间的关系是has_many,它会在提交表单时生成多个参数。 如果该属性只有一个订单,您需要将关系更改为has_one,然后您需要将订单更改为订单,然后您可以使用order_id。