【问题标题】:rails 3 form_tag method: :get to include only the fields that were changedrails 3 form_tag 方法::获取仅包含已更改的字段
【发布时间】:2013-10-27 14:22:21
【问题描述】:

我正在编写一个搜索表单,它将重新加载页面,并将搜索参数添加到 URL。

目前,我的表单生成的 URL 包含所有表单字段,包括空字段。这会使使用通常不需要的数据生成的 url 变得很混乱。

我希望我的表单重定向到仅包含包含数据的字段的 url。

这是我的表单的代码:

= form_tag orders_path, method: :get do
    = text_field_tag :search, params[:search], class: "span2 appendedInputButtons"
    = select_tag "order_types", 
      options_from_collection_for_select(OrderType.all, :id, :name),
      multiple: true, 
      size: 8, 
      include_blank: "select"
    %button.btn.btn-primary Update list

当我点击提交按钮而不填写任何表单时,我会被重定向到这样的网址:

http://localhost:3000/orders?utf8=%E2%9C%93&search=&order_types%5B%5D=

虽然我希望网址是这样的:

http://localhost:3000/orders

如果我只选择order_types 中的一部分,我会得到:

http://localhost:3000/orders?utf8=%E2%9C%93&search=&order_types%5B%5D=3&order_types%5B%5D=6

虽然我希望它是这样的:

http://localhost:3000/orders?order_types%5B%5D=3&order_types%5B%5D=6

甚至更好:

http://localhost:3000/orders?order_types=3,6

或类似的东西,但更简洁,

非常感谢您的帮助,

【问题讨论】:

    标签: ruby-on-rails forms activeview


    【解决方案1】:

    form_for 将表单绑定到一个对象,rails 内部将使用前缀命名与该对象(或多个对象)相关的字段,因此当提交表单时,数据将在参数中显示为params[:prefix][:some_data]

    为了减小查询字符串的大小,我建议您使用form_tagbuild the form manually。通过这种方式,您可以完全控制提交的字段,还可以避免utf8=%E2%9C%93 utf8 强制雪人黑客攻击。

    【讨论】:

    • 谢谢,form_tag 实际上是我使用的助手,表单必须包含我要选择的属性的所有字段。我不确定的是如何减小生成的 url 的大小。
    • 尝试使用= form_tag orders_path, method: :get, enforce_utf8: false do,这将删除 utf8 强制。要从 url 中删除 search=,您必须在提交之前使用 javascript 从表单中排除/禁用(使用 html 元素的 disabled='disabled' 属性)该字段,否则它将始终在查询字符串中发送。
    • 感谢您的回复,enforce_utf8: false 不适合我,disabled 的想法我不确定我是否明白,您是否建议让 ajax 在提交后动态添加属性按钮被按下了?
    • enforce_utf8: false 已在 Rails 4 中引入 -> form tag helper。关于“禁用”属性 - 是的,您必须让 javascript 执行此操作。
    猜你喜欢
    • 2012-12-17
    • 2017-09-14
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多