2012-08-17 18 views
16

Ho una tabella di "post" con attributi che includono title e body.Cerca in Rails

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> 

e post.rb

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

Quando presento i params di ricerca, ottengo un errore messaggio:

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: Voglio cercare per 'titolo'.

+9

Se si desidera cercare per titolo, perché si utilizza una colonna 'name', che apparentemente non esiste? –

+0

Dovresti postare il tuo commento come risposta dato che qui è sicuramente il problema;) – Robin

+0

Dave ThankYou !!! =))) –

risposta

38

Sebbene questa non sia una risposta diretta alla tua domanda, qui ci sono alcune risorse che potrebbero aiutarti mentre stai imparando sulla ricerca e implementandola nell'app Rails.

A Simple search form

Advanced search form

Searching with AJAX

Powerful search functionality with the Sunspot gem

List of the most popular search tools for Ruby

--------------- UPDATE ----- -----------

Elasticsearch sta crescendo in popolarità a causa di alcune meraviglie moderne che ha, come l'indicizzazione istantanea. Ha una gemma rubino di nome pneumatico. Sicuramente vale la pena dare un'occhiata.

Elasticsearch

Tire

--------------- UPDATE 2 ----------------

Tyre è stato ritirato, ed è stato sostituito da Elasticsearch-ruby

+0

@Richard Grazie per l'aggiornamento suggerito relativo alla sostituzione del pneumatico. –

+4

E 'stato rinominato, opportunamente, per' ritirarsi ' – Drew

+0

Questo è divertente. :) –

10

elasticsearch con la gemma searchkick

nota: searchkick è anche fornito da pneumatici) ti rende più comodo su cui lavorare.

Per maggiori riferimento:

SearchKick

8

Per le persone di venire qui e in cerca di una soluzione in Rails 4, provare il seguente esempio:

Messaggi Controller:

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 

Messaggio Modello:

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

L'index.html.erb rimane lo stesso a parte il modulo di ricerca:

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

Nota che i percorsi, i controller e le colonne che si sta utilizzando possono essere diverse.

+0

Facile e semplice. Grazie! –

+0

Non è necessario '@post = Post.all'? –

+0

Penso che tu abbia ragione @ Code-MonKy, sto facendo un aggiornamento ora. Grazie. –