我指的是官方教学,也阅读了所有类似的关于Stackoverflow的问答,但我没有使用Pagy和AJAX,所以这不是相同的错误。
我试图搜索name列在Task模型上的值。但是,当我输入一个匹配现有名称值并按Search的关键字时,结果是空的。我搞不懂为什么?
这是控制器的一部分:
  def index
    @name = Task.ransack(name_cont: params[:q])
    @tasks = @name.result
    puts @tasks
  end这是视图
<%= 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>这是终端日志
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)发布于 2022-03-20 21:05:36
您的代码应该是Task.ransack(name_cont: params[:q][:name]),因为您的params看起来如下:{"q"=>{"name"=>"TT"} }。
但是,您正在使用相同的操作,index来呈现初始页面(当用户登陆它时),以及在按下Search之后。当页面首先呈现时,即http://localhost/tasks,q参数不存在,写入params[:q][:name]显然会失败,因为params[:q]是nil。
理想情况下,您应该保留index来呈现搜索表单,并为search执行另一个操作。
但是,如果您想保持原样,可以将其写成如下所示:
假设你有一个TasksController
class TasksController < ApplicationController
  def index
    @query = Task.ransack(params[:q])
    @tasks = @query.result
  end
end搜索表单在/tasks上
<%= 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%'
https://stackoverflow.com/questions/71523687
复制相似问题