首页 > 解决方案 > 搜索表单找不到具有 'id'= 的用户

问题描述

我需要创建搜索表单来搜索用户的所有案例 pt_name

我收到了这个错误

找不到具有 'id'= 的用户

万一控制器

def index
    @user =User.find(params[:id])
    @cases=@user.cases
    if params[:search]
      @search_term = params[:search]
      @cases= @user.cases.casesearch_by(@search_term)
    end
  end

万一模型

class Case < ActiveRecord::Base
  belongs_to :user

  def self.casesearch_by(search_term)
    where("LOWER(pt_name) LIKE :search_term OR LOWER(shade) LIKE :search_term",
     search_term: "%#{search_term.downcase}%")
  end
end

在 index.html.erb 的情况下

<%= form_for "",url: cases_path(@user.id), role: "search", method: :get  ,class: "navbar-form navbar-right" do %>
         <%= text_field_tag :search, @search_term,placeholder: "Search..."  %>
 <% end %>

标签: ruby-on-railsdatabasesearchmodel-view-controller

解决方案


问题是控制器中的第一行。提交表单时,它会cases_path(@user.id)- 这就是您在表单中指定的内容。

如果您正在检查,rails routes您会看到 case_path 实际上是“/cases”(我假设您没有覆盖它)并且没有任何占位符用于 id (就像它用于显示操作一样例如转到“/cases/:id”。

现在您仍然指定@user.idincases_path(@user.id)然后尝试从参数中查找具有 id 的用户。但是,如果您在到达控制器后检查您的参数(使用 binding.pry 或其他工具),您将看到:id参数中没有键。您还可以检查它要访问的 url,我相信它看起来像这样:“/cases.1”。

您可以通过更改路径来解决该问题

cases_path(user_id: @user.id)

这样,您可以将新的键值对添加到 params 哈希,然后在您的控制器中,您需要相应地更改它:

@user =User.find(params[:user_id])

您还可以在表单中添加隐藏字段以传递用户 ID:

<%= form_for "", url: cases_path, role: "search", method: :get, class: "navbar-form navbar-right" do %>
   <%= text_field_tag :search, @search_term,placeholder: "Search..."  %>
   <%= hidden_field_tag :user_id, @user.id %>
 <% end %>

然后在控制器中检索它。

要检查您在控制器操作中获得的参数,请使用 pry byebug 之类的 gem 或仅使用关键字raise,然后检查params变量。


推荐阅读