我在我的application.html.erb标题中构建了一个搜索栏,允许访问者在我的网站上搜索“用户”,点击“提交”按钮显示搜索结果后,发现结果似乎不合适在我的页面上打印(它只是空白)。
我在我的users文件夹下创建了index.html.erb,以及_user.html.erb,所以我不确定为什么会发生这种情况(据我所知,_user.html.erb是必要的显示找到/渲染的结果)?
我应该在_user.html.erb中放置一行代码吗?
以下是 index.html.erb 中的内容:
<% if @user.present? %>
<%= render @user %>
<% else %>
<p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
如果您需要我的其他文件:
users_controller.rb
def index
@user = User.all
if params[:search]
@user = User.search(params[:search]).order("created_at DESC")
else
@user = User.all.order('created_at DESC')
end
end
user.rb
def self.search(search)
where("firstname LIKE ?", "%#{search}%")
where("lastname LIKE ?", "%#{search}%")
end
答案 0 :(得分:0)
您的search
方法没有结果,这就是您之后看不到任何结果的原因。更改您的where
语句,因为它创建和AND查询,您可能正在寻找OR。请尝试类似:
def self.search(search)
where("firstname LIKE ? OR lastname LIKE ?", "%#{search}%", "%#{search}%")
end
希望这有帮助
答案 1 :(得分:0)
通常不会将params
传递回视图 - 主要是我认为因为它会针对每个请求进行更改,并且最终可能会与您的预期不同。您可能希望将其复制到控制器中的实例变量。
<% if @users.present? %>
<%= render @users %>
<% else %>
<p>There are no posts containing the term(s) <%= @search %>.</p>
<% end %>
<强> _user.html.erb 强>
<%= user.firstname %> <%= user.lastname%>
@user = User.all
,它什么也没做。@users
。.all
条款中的else
废话,没有必要。应该是:
def index
@search = params[:search]
if @search
@users = User.search(@search).order("created_at DESC")
else
@users = User.order('created_at DESC')
end
end
where("firstname LIKE ?", "%#{search}%")
被忽略了。它运行它,但抛出结果并仅返回下一行的结果。你想要:
def self.search(search)
where("firstname LIKE :p OR lastname LIKE :p", p: "%#{search}%")
end
- 从单个参数中搜索多个令牌的多个字段
如果你想尝试这个,你是受虐狂。但这是可能的,而且我之前已经做过了。
注意:这是为SQL Server 2008编写的,因为那是我公司当时使用的。某些SQL函数(尤其是IsNull
和LIKE
)可能会有所不同,具体取决于您使用的内容。
class User
scope :search, ->(value) do
# This allows tokens containing A-z, 0-9, _, and %. Anything else is treated
# as a delimiter.
multi_field_search(%w[firstname lastname], value.split(/[^\w%]/))
end
# This scope is generic, and reusable for any combination of string fields in
# any model.
scope :multi_field_search, ->(fields, values) do
# You're looking in these fields...
fields_clause = fields.select(&:present?).map do |field|
"IsNull(#{field}, '')"
end.join(" + ' ' + ")
# ... for these values...
values_clause = sanitize_conditions(values.select(&:present?).map do |value|
"combo_view.combination LIKE '%#{value}%'"
end.join(' AND '))
# ... and you do it by constructing a query to join the fields together, and
# searching for each token of the search parameter individually.
joins(<<-SQL).where(values_clause)
INNER JOIN (
SELECT *, #{fields_clause} AS combination
FROM #{table_name}
) AS combo_view ON #{table_name}.#{primary_key} = combo_view.#{primary_key}
SQL
end
# ...
end