ruby-on-rails - 搜索表单找不到具有 '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 %>
解决方案
问题是控制器中的第一行。提交表单时,它会cases_path(@user.id)
- 这就是您在表单中指定的内容。
如果您正在检查,rails routes
您会看到 case_path 实际上是“/cases”(我假设您没有覆盖它)并且没有任何占位符用于 id (就像它用于显示操作一样例如转到“/cases/:id”。
现在您仍然指定@user.id
incases_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
变量。
推荐阅读
- c# - UWP Listview 在水平滚动中冻结列
- markdown - 如何使用 Blazor 在 textarea 或 inputTextArea 内渲染 MarkDown
- css - Bulma:无法在按钮上同时使用 is-static 和 is-primary 修改
- php - 如何在 Laravel 中更新或创建 Redis 缓存数据?
- powershell - 从 Select-Object 结果中删除方括号
- php - HTML 表单到电子邮件 + 3rd 方表单后端平台
- jenkins - 在 Fargate 上创建 Jenkins 代理
- c - 有人可以解释一下编译器自动添加到 C 程序中的启动代码是什么吗
- raku - 如何检查某物是否是 qw 的元素?
- python - 如何检查一个字符是否在Python字符串中的特定位置?