首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Ransack没有显示任何搜索结果

为什么Ransack没有显示任何搜索结果
EN

Stack Overflow用户
提问于 2022-03-18 07:31:43
回答 1查看 210关注 0票数 -1

我指的是官方教学,也阅读了所有类似的关于Stackoverflow的问答,但我没有使用Pagy和AJAX,所以这不是相同的错误。

我试图搜索name列在Task模型上的值。但是,当我输入一个匹配现有名称值并按Search的关键字时,结果是空的。我搞不懂为什么?

这是控制器的一部分:

代码语言:javascript
复制
  def index
    @name = Task.ransack(name_cont: params[:q])
    @tasks = @name.result
    puts @tasks
  end

这是视图

代码语言:javascript
复制
<%= search_form_for @name do |f| %>
  <%= f.label :name, "Search for" %>
  <%= f.search_field :name, placeholder: "Mission Name" %>
  <%= f.submit %>
<% end %>

<h1><%= t('task_list') %></h1>
  <ul>
    <% @tasks.each do |task| %>
      <li>
        <%= task.name %>
        <%= t('task_status') %>:<%= task.status %>
          <%= link_to t('task_cont') , task_path(task) %>
            <%= link_to t('task_do_edit') , edit_task_path(task) %>
            <%= link_to t('task_do_kill') , task_path(task), method: :delete, data:{ confirm: t('task_do_sure') } %>
      </li>
    <% end %>
  </ul>

这是终端日志

代码语言:javascript
复制
Started GET "/my_task_list?q%5Bname%5D=TT&commit=%E6%90%9C%E5%B0%8B" for 127.0.0.1 at 2022-03-18 15:22:49 +0800
Processing by TasksController#index as HTML
  Parameters: {"q"=>{"name"=>"TT"}, "commit"=>"搜尋"}
  Task Load (0.3ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."name" ILIKE '%{"name"=>"TT"}%'
  ↳ app/controllers/tasks_controller.rb:14:in `puts'
  Rendering layout layouts/application.html.erb
  Rendering tasks/index.html.erb within layouts/application
  Rendered tasks/_navbar.html.erb (Duration: 0.4ms | Allocations: 298)
  Rendered tasks/index.html.erb within layouts/application (Duration: 1.2ms | Allocations: 830)
[Webpacker] Everything's up-to-date. Nothing to do
  Rendered layout layouts/application.html.erb (Duration: 83.5ms | Allocations: 3871)
Completed 200 OK in 87ms (Views: 84.3ms | ActiveRecord: 0.3ms | Allocations: 5108)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 21:05:36

您的代码应该是Task.ransack(name_cont: params[:q][:name]),因为您的params看起来如下:{"q"=>{"name"=>"TT"} }

但是,您正在使用相同的操作,index来呈现初始页面(当用户登陆它时),以及在按下Search之后。当页面首先呈现时,即http://localhost/tasksq参数不存在,写入params[:q][:name]显然会失败,因为params[:q]nil

理想情况下,您应该保留index来呈现搜索表单,并为search执行另一个操作。

但是,如果您想保持原样,可以将其写成如下所示:

假设你有一个TasksController

代码语言:javascript
复制
class TasksController < ApplicationController
  def index
    @query = Task.ransack(params[:q])
    @tasks = @query.result
  end
end

搜索表单在/tasks

代码语言:javascript
复制
<%= search_form_for @query do |f| %>
  <%= f.label :name, "Search for" %>
  <%= f.search_field :name_cont, placeholder: "Mission Name" %>
  <%= f.select :status_eq, Task.statuses.map { |key, value| [key.titleize, value] }, prompt: 'Choose Status' %>
  <%= f.submit %>
<% end %>
....

您可以看到,我添加了name_cont作为搜索字段。您可以添加更多内容,即status_eq,当您按Search时,所有内容都将被发送到params[:q]中的服务器。

注意日志,看看q是什么样的,以及在Tasks中执行了什么查询。

Task Load (0.9ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."name" ILIKE '%test%'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71523687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档