【问题标题】:Rails search form - not rendering resultsRails 搜索表单 - 不呈现结果
【发布时间】: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 的新手,感谢您的耐心和帮助!

进一步说明:

The index page.

当我提交查询 ('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)

但是页面没有呈现并且保持不变。

Github for reference.

我很确定问题出在表格上。

【问题讨论】:

  • 如果没有重现问题的实际示例,我们无法真正知道。它可能有很多东西,如视图、缓存等。此外,如果您想搜索数据库列,您很可能希望使用 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


【解决方案1】:

解决了。我感觉问题出在表单上,​​所以我将其稍微更改为这个,它起作用了:

<%= form_tag('/pets', method: 'get') %>
  <%= text_field_tag :query %>
  <%= submit_tag 'Submit' %>

此外,在以下上下文中使用 form_with 也可以:

<%= form_with(url: '/pets', local: true, method: 'get') do |f| %>
  <%= f.label :query, 'Enter Name to Search' %>
  <%= f.text_field :query %>
  <%= f.submit 'Search' %>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2018-10-25
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多