在Rails中搜索

20

我有一个名为"posts"的表格,其中包含标题(title)正文(body)等属性。

posts_controller.rb:

class PostsController < ApplicationController
  def index
    @posts = Post.search(params[:search], params[:id])
  end
end

index.html.erb:

 <%= form_tag posts_path, :method => 'get'  do %>
   <%= text_field_tag :search, params[:search]%>
   <%= submit_tag "Search", :name => nil  %>
 <% end %>

<hr />
<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
  </tr>
 <tr>
  <td><hr></td>
  <td><hr></td>
</tr>
  <% @posts.each do |post| %>

    <tr>
      <td><%= post.title %></td>
      <td><%= post.text %></td>
      <td><%= link_to 'Show', :action => :show, :id => post.id %></td>
      <td><%= link_to 'Edit', :action => :edit, :id => post.id %></td>
      <td><%= link_to 'Destroy', { :action => :destroy, :id => post.id }, :method => :delete, :confirm => 'Are you sure?' %></td>
    </tr>
    <tr>
      <td><hr></td>
      <td><hr></td>
    </tr>
  <% end %>
</table>

以及 post.rb 文件

def self.search(search, id)
 if search
   where(['name LIKE ?', "%#{search}%"])
 else
  scoped
 end
end

当我提交搜索参数时,会收到一个错误消息:

ActiveRecord::StatementInvalid in Posts#index 
SQLite3::SQLException: no such column: name: SELECT "posts".* FROM "posts"  WHERE (name LIKE '%lorem%') 

Extracted source (around line #23):

23:   <% @posts.each do |post| %>

APD: 我想通过“标题”进行搜索。


9
如果您想按标题搜索,为什么要使用一个明显不存在的“名称”列呢? - Dave Newton
你应该将你的评论发布为答案,因为它肯定是这里的问题 ;) - Robin
请告诉我,在视图中为什么需要:title => nil? - Dmytro Vasin
3个回答

47

虽然这不是你问题的直接答案,但以下资源可能会帮助你学习搜索并在Rails应用程序中实现它。

一个简单的搜索表单

高级搜索表单

使用AJAX进行搜索

使用Sunspot gem强大的搜索功能

Ruby最受欢迎的搜索工具列表

---------------更新----------------

Elasticsearch因其一些现代化特性而越来越受欢迎,如即时索引。它有一个名为tire的ruby gem,绝对值得一看。

Elasticsearch

Tire

---------------更新2----------------

Tire已经被退役,并被Elasticsearch-ruby所取代。


@Richard 感谢您提出的有关更换轮胎的建议更新。 - Aaron Gray
6
它被恰当地改名为“退役”。 - Drew
“一个简单的搜索表单”不是容易受到SQL注入攻击吗? - Recomer

13

如果你是在使用Rails 4并且正在寻找解决方案,可以尝试下面的示例:

文章控制器:

class PostsController < ApplicationController
  def index
    if params[:search]
      @posts = Post.search(params[:search]).order("created_at DESC")
    else
      @posts = Post.all.order('created_at DESC')
    end
  end
end

文章模型:

def self.search(search)
  # Title is for the above case, the OP incorrectly had 'name'
  where("title LIKE ?", "%#{search}%")
end

除了搜索表单,index.html.erb保持不变:

<%= form_tag(posts_path, :method => "get", id: "search-form") do %>
  <%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
  <%= submit_tag "Search" %>
<% end %>

请注意,您使用的路径、控制器和列可能会有所不同。


10

使用gem搜索引擎searchkick的Elasticsearch

注意: searchkick也是tire的贡献者,可以让您更轻松地工作。

更多参考:

SearchKick


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接