2012-08-17 13 views
16

Mam tabelę "posty" z atrybutami, które obejmują title i body.Wyszukiwanie w Railsach

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> 

i post.rb

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

Kiedy złożyć params wyszukiwania, otrzymuję komunikat o błędzie wiadomość:

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: Chcę wyszukiwać według "tytułu".

+9

Jeśli chcesz szukać według tytułu, dlaczego używasz kolumny "nazwa", która najwyraźniej nie istnieje? –

+0

Powinieneś zamieścić swój komentarz jako odpowiedź, ponieważ jest to zdecydowanie problem;) – Robin

+0

Dave ThankYou !!! =))) –

Odpowiedz

38

Chociaż nie jest to bezpośrednia odpowiedź na Twoje pytanie, oto kilka zasobów, które mogą Ci pomóc, gdy uczysz się o wyszukiwaniu i wprowadzeniu go w aplikację 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 zyskuje na popularności ze względu na nowoczesną wspaniałość, taką jak indeksowanie natychmiastowe. Ma rubinowy klejnot o nazwie opona. Zdecydowanie warte zobaczenia.

Elasticsearch

Tire

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

Opona została wycofana, i został zastąpiony przez Elasticsearch-ruby

+0

@Richard Dziękujemy za sugerowaną aktualizację dotyczącą wymiany opony. –

+4

Zmieniono nazwę odpowiednio na "wycofanie" – Drew

+0

To zabawne. :) –

10

Elasticsearch z gem searchkick

note: searchkick jest także współużytkowane przez oponę) ułatwia pracę.

Więcej dotyczą:

SearchKick

8

Dla osób przyjeżdżających tu i szuka rozwiązania w Rails 4, spróbuj następujący przykład:

postach Kontroler:

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 

post Model:

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

index.html.erb pozostaje taka sama, oprócz formularza wyszukiwania:

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

Zauważ, że ścieżki, kontrolery i kolumny używasz może być inna.

+0

Łatwe i proste. Dzięki! –

+0

Czy '@post = Post.all' nie jest niepotrzebny? –

+0

Myślę, że jesteś poprawny @ Code-MonKy, teraz robię aktualizację. Dzięki. –