【问题标题】:Why can't I post a form field with 'status' in the name?为什么我不能发布名称中带有“状态”的表单字段?
【发布时间】:2012-11-01 10:15:43
【问题描述】:

编辑 - 显然没有人知道这里让我烦恼的是什么。我认为这只是我在页面其他地方所做的某些事情阻止了正在发送的状态属性的问题。问题是我什么都看不到。我希望有人看到过类似的东西并可以建议我需要看的地方。


我的页面上有一个虚拟表单,用于将数据发布到我的网络应用程序。它是在 Rails 中创建的(使用 HAML),就像这样;

=form_tag bulk_invoice_path(''), method: 'put', class: 'mark-sent-form' do
  =hidden_field_tag 'invoice[status]', 'Sent'

这会生成以下html;

<form accept-charset="UTF-8" action="/bulk_invoices/" class="mark-sent-form" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="_method" type="hidden" value="put" />
    <input name="authenticity_token" type="hidden" value="OU8GtbHycR/EJ+H3GG9MN59xI59v47LSaFc2wYZloAs=" />
  </div>
  <input id="invoice_status" name="invoice[status]" type="hidden" value="Sent" />
</form>

在 DOM 中,如下所示

<form accept-charset="UTF-8" action="/bulk_invoices/" class="mark-sent-form" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="✓">
    <input name="_method" type="hidden" value="put">
    <input name="authenticity_token" type="hidden" value="OU8GtbHycR/EJ+H3GG9MN59xI59v47LSaFc2wYZloAs=">
  </div>
  <input id="invoice_status" name="invoice[status]" type="hidden" value="Sent">
</form>

这个表格是用jquery(使用coffeescript)发布的;

jQuery ->
  $('a.mark-sent').click -> updateBulkInvoices('.mark-sent-form')

updateBulkInvoices = (form) ->
  $(form).attr('action', "/bulk_invoices/#{checkedInvoices().get().join()}").submit()

这种模式在其他操作中对我很有帮助,但“发票[状态]”似乎引起了问题。当使用 jQuery 提交表单时,隐藏字段不会被传递。我在 Rails 控制台中看到以下内容;

Parameters: {"utf8"=>"✓", "authenticity_token"=>"+qW9kIih5l2j69w1LK2YfQ9mYQ7nKPDm5XgLZuKB4ic=", "id"=>"16"}

即invoice[status] 字段未与表单参数一起传递。如果我将此字段的名称更改为其他任何名称,它就可以正常工作,例如

=form_tag bulk_invoice_path(''), method: 'put', class: 'mark-sent-form' do
  =hidden_field_tag 'invoice[flatus]', 'sent'

在我的控制台中为我提供以下参数;

Parameters: {"utf8"=>"✓", "authenticity_token"=>"+qW9kIih5l2j69w1LK2YfQ9mYQ7nKPDm5XgLZuKB4ic=", "invoice"=>{"flatus"=>"sent"}, "id"=>"16"}

如果我在 Chrome 的开发人员工具上监控“网络”选项卡,我会看到同样的事情发生,所以我认为这不是 Rails 问题,这似乎是浏览器问题。不过,我在 Safari 和 Firefox 上也得到了同样的结果。

状态是浏览器表单中某种神奇的保留字吗?这是怎么回事?

【问题讨论】:

  • 没有这样的保留字我试过了,效果很好
  • 好的,但它不适合我。
  • 你能把生成的HTML表单贴出来吗?
  • 如果它没有出现在网络标签中,那么它是一个表单问题。您可以从源代码和 DOM 发布表单 html 吗?
  • 您是否有机会在所有浏览器中使用相同的插件/扩展程序?它适用于 Aayush 的事实,但不是你,这表明你有一些特别的事情发生......尝试禁用所有 Chrome 的扩展程序,看看是否有东西拦截它。

标签: ruby-on-rails forms browser parameters


【解决方案1】:

我无法重现该问题,但我怀疑它是由提交表单时的 Javascript 引起的。要对此进行调试,您可以执行以下操作:

  1. 在 Chrome 中打开页面
  2. 右击提交按钮,选择“检查元素”
  3. 选择“来源”标签。
  4. 在源选项卡中,找到被调用的 Javascript 的源 当您单击提交时。您可能需要单击 “元素”选项卡下方的框中的小右箭头。另外,如果 代码已经被丑化了,所有的换行符都被删除了,你可以 单击底部的“漂亮打印”花括号图标 页面。
  5. 找到方法后,单击它旁边的行号 左。在右侧窗格中,您应该会看到它出现在 “断点”部分。
  6. 重新加载页面
  7. 点击提交按钮。

这应该会带您进入在提交操作时暂停的 Javascript 调试器,然后您可以单步执行代码并查看它在做什么。

我希望这会有所帮助!

【讨论】:

  • 太棒了,谢谢。这促使我最终正确地单步执行我的代码,并且我发现了一个与我正在调用的函数同名的函数。我很久以前写过它,替换它,没有删除它并忘记它。无论如何,这是我的表格没有正确提交的罪魁祸首。这个项目有比我以前写过的更多的 Javascript,我开始迷失方向。我想我需要一些关于 Javascript 争论的技巧!
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 2015-03-02
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多