【问题标题】:Params become plural/incorrect on render after failing validation验证失败后,参数在渲染时变为复数/不正确
【发布时间】: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 =&gt; 1提交的,而不是order_id =&gt; 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(它也支持引导程序)。无论如何:问题与cocoonnested_form(构建具有嵌套属性的表单)无关,但与您的路线定义(或您的表单网址)有关。你能解释一下你想要做什么吗?您的 form-url = prop_order_update_patch_path(@properties, @orders) 所以您似乎想要处理一系列订单,因此是 orders_id
  • 对宝石的了解很有趣,谢谢。我现在只在 Rails 中编码大约 6 个月,而 bootstrap_form_for gem 是我开始时首先选择的,并且从未切换过。基本上@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


【解决方案1】:

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

【讨论】:

  • 你是绝对正确的,对于这些关联,Propertyhas_many :ordersOrderbelongs_to。我不知道这会对参数产生影响,所以我很高兴你抓住了它。纠正这种情况的最佳方法是什么?
猜你喜欢
  • 2015-05-31
  • 2016-05-08
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2012-06-13
  • 2015-08-17
相关资源
最近更新 更多