Rails搜索功能

时间:2012-02-28 21:09:25

标签: ruby-on-rails-3 ruby-on-rails-3.1

我正在我的大学上学习导轨课程,我正在尝试创建一个搜索表单,该表单将在同一页面上显示结果,而不是显示不同的结果页面。这件事情很简单吗?我正在为每个博物馆创建一个带有文物的博物馆应用程序,但我希望用户从任一页面搜索文物。

在我的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 %>

2 个答案:

答案 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”宝石。它还可以执行更强大的搜索。