【发布时间】:2017-08-20 23:10:01
【问题描述】:
所以我有一个奇怪的问题,我似乎无法弄清楚。基本上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通过表单提交的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"}
在我的控制器操作中,我将在@properties.save 失败后在render 上方调用@orders = Order.find(params[:orders_id]),但是当它呈现时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
【问题讨论】:
-
你能把完整的表格贴出来吗?
-
bootstrap_nested_form_for命令不使用 cocoon,而是使用nested_form。所以最好不要混合这些。此外,这两个 gem 都已经过时了,我会推荐simple_form(它也支持引导程序)。无论如何:问题与cocoon或nested_form(构建具有嵌套属性的表单)无关,但与您的路线定义(或您的表单网址)有关。你能解释一下你想要做什么吗?您的 form-url =prop_order_update_patch_path(@properties, @orders)所以您似乎想要处理一系列订单,因此是orders_id。 -
对宝石的了解很有趣,谢谢。我现在只在 Rails 中编码大约 6 个月,而
bootstrap_form_forgem 是我开始时首先选择的,并且从未切换过。基本上@orders属于@properites所以路线是/properties/:property_id/orders/:order_id/prop_order_wiz用于使用jQuery steps插件填写“订单”的一系列表格。我想要做的是将:order_id传递到新的deed记录上,该记录也是belongs_to Property,并且在第一次加载时工作正常,但如果契约验证失败,则会导致上述情况 -
我认为复数形式最令人困惑:你写
@properties和@orders--> 它们是如何设置的?这些不应该是单数吗?如果@orders是一个数组,它解释了为什么 url 的构建方式不同(变成orders_id) -
我保持与我的资源路由相同的命名约定。就像我有
resources :properties do resources :orders, :deeds, :etc end一样,它基于我的控制器名称,其中名称是复数的,我认为这就是应该的方式。有错吗?
标签: ruby-on-rails parameters ruby-on-rails-5 nested-forms cocoon-gem