【问题标题】:Rails appending empty query parameters (/new?) to my URLSRails 将空查询参数 (/new?) 附加到我的 URLS
【发布时间】:2023-06-09 06:29:01
【问题描述】:

这个问题可能有一个明显的答案......但我不确定在哪里找。

出于某种原因,rails 在某些重定向上将空查询字符串附加到我的 URL。我有一个用户“仪表板”页面,他们可以在其中单击一个按钮来创建一个新的“foo”。

当我单击按钮转到此路径时,url 显示为:“localhost/foo/new?”

我不知道这个幻像查询参数是从哪里来的......我什至不知道这是否有什么大不了的,但出于某种原因,我觉得它可能会在缓存或 SEO 端伤害我.有没有人有一些关于在哪里看的指示?

更新 1

我用来生成指向 new_foo 项目的链接的代码(使用 HAML 和引导程序):

= button_to "New Foo!", new_foo_path, :method => :get, :class => btn_class

控制器中的代码如下所示:

def new
  @foo = Foo.new(:my_attribute => 2500)
end

关于第二条评论——我不认为这个对象此时会被持久化在数据库中?我认为 Rails object.new 方法只是在内存中构建它,直到#save 才会持久化。

更新 2

在将代码更改为“link_to”时,问题似乎已经消失了......你能解释一下吗?

【问题讨论】:

  • 在调用 new_foo 帮助器生成新的 foo 链接时,您可以添加您正在使用的代码吗?
  • 检查foo是否持久化在数据库中。
  • 感谢 cmets 伙计们 - 我在问题中添加了更多详细信息。我什至可能想通了,但不知道为什么! @luacassus - 我不认为此时该对象会保留在数据库中......通常新操作只是在内存中为表单创建一个对象?

标签: ruby-on-rails url params


【解决方案1】:

button_to 与 link_to 不同。 button_to 实际上会在页面中构建一个表单。表格会是这样的。

<form action="/foo/new" class="button_to" method="get">
   <div><input type="submit" value="abc"></div>
</form>

它是一个获取表单,当点击提交时,将使用表单中的输入字段作为参数。不会使用该操作的查询。例如:

= button_to new_foo_path(:test => true)
#=> <form action="/foo/new?test=true" class="button_to" method="get">
      <div><input type="submit" value="abc"></div>
    </form>

当你点击提交时,url 将是“/foo/new?”,test=true 消失了。它是 html 的专长。可能是一个更多的例子会让你明白。

= form_tag(new_foo_path(:test => true), :method => :get) do
   = hidden_field_tag "field_in_form", "true"
   = submit_tag "submit"

点击提交后。网址将是“/foo/new?field_in_form=true”。我认为是“?”当您提交包含输入的获取表单时始终出现(包括 submit_tag)。

【讨论】:

  • 感谢刀片的详细回答。我想我现在已经掌握了这个!