How do you add search to a layout so it can search for posts through every page of the site? such as here on stackoverflow.
Tutorials show adding the search method to the index action of the PostsController, and then adding the form and results block in views/post/index.html.erb.
I've been trying to create a form in application.html.erb that sends a get request to the search action of the posts controller. I can't seem to get it right, can someone help explain where I'm going wrong?
Currently I'm getting this error when going to my homepage:
NameError in Pages#home
undefined local variable or method `search_posts_path'
PostsController
def search
if params[:q]
query = params[:q]
@search = Post.search do
keywords query
end
@posts = @search.results
end
end
post model
searchable do
text :title, :default_boost => 2
text :content
end
routes.rb
match 'auth/:provider/callback' => 'authentications#create'
resources :authentications
devise_for :users, :controllers => {:registrations => 'registrations'}
resources :posts do
member do
get :likers, :search
end
end
resources :relationships, :only => [:create, :destroy]
resources :appreciations, :only => [:create, :destroy]
root :to => "pages#home"
match '/contact', :to => 'pages#contact'
match '/about', :to => 'pages#about'
match '/help', :to => 'pages#help'
match '/blog', :to => 'pages#blog'
resources :users do
member do
get :following, :followers, :lik开发者_C百科es
end
resources :collections
end
views/layouts/application.html.erb
<%= form_tag search_posts_path, :method => :get do %>
<p>
<%= text_field_tag :q, params[:q] %> <%= submit_tag "Search!" %>
</p>
<% end %>
PagesController
def home
@title = "Home"
if user_signed_in?
@user = current_user
@post = current_user.posts.build
@feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page])
else
#render :layout => 'special_layout'
end
end
This is a Ruby on Rails routing question.
The member
route is for operating on a single record. So you are defining search_post_path(@post)
which will route to something like /posts/1/search
What you want is a collection
route.
resources :posts do
member do
get :likers
end
collection do
get :search
end
end
This will create the search_posts_path
method and route to /posts/search
as you are expecting.
See also: http://guides.rubyonrails.org/routing.html#adding-more-restful-actions
精彩评论