【发布时间】:2020-03-27 09:40:10
【问题描述】:
为此而疯狂,感谢您的帮助!
我有一个带有索引的 PetsController,一切正常。现在,我想在索引中添加一个搜索表单,而不是将@pets 分配给Pet.all,而是使用用户的查询搜索数据库,如下所示:
def index
if ...
...
elsif params[:query]
@pets = Pet.where("name ~ ?", "#{params[:query]}")
else
...
end
end
表格如下所示:
<%= form_with(url: '/pets', method: "get") do %>
<%= text_field_tag :query %>
<%= submit_tag 'Submit' %>
<% end %>
如果我在 elsif 中放置一个绑定,我发现我确实在命中它,它会返回正确的结果并将其分配给 @pets。但是页面仍然在渲染所有的宠物。现在,如果我将参数放在 URL 中,它可以正常工作并且只显示我想要的内容:http://127.0.0.1:3000/pets?query=Lime
所以我的问题是,如果它正确分配了@pets 变量,为什么它仍然渲染所有宠物?为什么它只适用于 URL 中的参数?我还是 Rails 的新手,感谢您的耐心和帮助!
进一步说明:
当我提交查询 ('Fido') 时触发的 SQL 似乎有效:
Rendering pets/index.html.erb within layouts/application
Pet Load (1.5ms) SELECT "pets".* FROM "pets" WHERE (name ~ 'Fido')
↳ app/views/pets/_pets.html.erb:23
Owner Load (0.3ms) SELECT "owners".* FROM "owners" WHERE "owners"."id" = $1 LIMIT $2 [["id", 8], ["LIMIT", 1]]
↳ app/models/pet.rb:11:in `name_with_owner'
Rendered pets/_pets.html.erb (Duration: 5.6ms | Allocations: 1472)
Rendered pets/index.html.erb within layouts/application (Duration: 6.2ms | Allocations: 1657)
但是页面没有呈现并且保持不变。
我很确定问题出在表格上。
【问题讨论】:
-
如果没有重现问题的实际示例,我们无法真正知道。它可能有很多东西,如视图、缓存等。此外,如果您想搜索数据库列,您很可能希望使用 LIKE/ILIKE 而不是
~。 stackoverflow.com/questions/12452395/… -
感谢您的回复。似乎问题在于它没有重新呈现索引页面。如果我将参数手动输入到 URL 中,它可以正常工作。我已经排除了缓存。视图只是渲染
@pets,所以我不确定视图内部的问题会如何搞砸。我将添加一个示例 -
啊,现在我明白发生了什么事。您需要使用
form_with(url: '/pets', method: "get", local: true)。form_with默认为remote: true,因此 Rails UJS 处理程序会自动将其转换为js.erb模板的 ajax 请求。我真的希望这不是默认设置。
标签: ruby-on-rails