我正在我的大学上学习导轨课程,我正在尝试创建一个搜索表单,该表单将在同一页面上显示结果,而不是显示不同的结果页面。这件事情很简单吗?我正在为每个博物馆创建一个带有文物的博物馆应用程序,但我希望用户从任一页面搜索文物。
在我的routes.rb上我有
resources :artifacts do
collection do
get 'search'
end
end
在我的博物馆索引上,我有他给我们的代码,但不知道如何调整同一页面的获取路线。
<%= form_tag search_artifacts_path, :method => 'get' do %>
<p>
<%= text_field_tag :search_text, params[:search_text] %>
<%= submit_tag 'Search' %>
</p>
<% end %>
<% if @artifacts %>
<p> <%= @artifacts.length %> matching artifacts. </p>
<h2> Matching Artifacts </h2>
<% @artifacts.each do |a| %>
<%= link_to "#{a.name} (#{a.year})", a %><br />
<% end %>
<% end %>
答案 0 :(得分:3)
是的,这很容易。如果存在params[:search_text]
,只需让索引页面返回搜索结果 - 这样您就不需要新的路径或不同的页面了。
class ArtifactsController < ApplicationController
def index
@artifacts = Artifact.search(params[:search_text])
end
end
class Artifact < ActiveRecord::Base
def self.search(query)
if query
where('name ILIKE ?', "%#{query}%")
else
all
end
end
end
那么你的表格就像:
<%= form_tag artifacts_path, :method => 'get' do %>
<p>
<%= text_field_tag :search_text, params[:search_text] %>
<%= submit_tag 'Search' %>
</p>
<% end %>
编辑:
所以你真正想要做的就是你要搜索的任何页面,包括一个向同一页面发出请求的表单。
然后在每个控制器方法中只放下这行代码:
@artifacts = Artifact.search(params[:search_text])
这将填充@artifcats
数组,只包含与搜索查询匹配的工件。
答案 1 :(得分:0)
尝试使用“Ransack”宝石。它还可以执行更强大的搜索。