Ruby on the Rails Search Functionality 2nd attempt

My first attempt is here. However that lacked a search box. It was neat in that you could reference the search directly as http://blah/blah/searchstring. However that’s not really what we want, as we want to use search forms and such….

So attempt 2.

First add routes for 2 net methods to routes.rb:

1
2
3
4
5
6
resources :words do
  collection do
    get 'dosearch'
    get 'search'
  end
end

I then added 2 new methods to the appropriate controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def search
  @words = Word.where("word = ?",params[:id]) #all #find(params[:id])
 
  respond_to do |format|
    format.html # search.html.erb
    format.json { render json: @words }
  end
end
 
def dosearch
  @word = ""
  respond_to do |format|
    format.html
    format.json { render json: word }
  end
end

The first method is as before, and performs the search. The second method really just returns the search html. Perhaps I shouldn’t be using a method for this at all? Just some static html?

Then I added a dosearch.html.erb which will render the search form:

1
2
3
4
5
<h1>Search for word</h1>
 
<%= render 'searchform' %>
 
<%= link_to 'Back', words_path %>

And a _searchform.html.erb which /actually/ renders the form:

1
2
3
4
5
%= form_tag("/words/search", :method => "get") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:id) %>
  <%= submit_tag("Search") %>
<% end %>

Next I added a search.html.erb for the search results:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<h1>Search Results</h1>
 
<table>
  <tr>
    <th>Word</th>
    <th>Definition</th>
    <th>Tags</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
 
<% @words.each do |word| %>
  <tr>
    <td><%= word.word %></td>
    <td><%= word.tags %></td>
    <td><%= word.definition %></td>
    <td><%= link_to 'Show', word %></td>
    <td><%= link_to 'Edit', edit_word_path(word) %></td>
    <td><%= link_to 'Destroy', word, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>
 
<br />
 
<%= link_to 'New Word', new_word_path %>
 
<% if session[:user_id] %>
<%= button_to 'Logout', logout_path, method: :delete %>
<% end %>
</div>
<div id="main" >
<%= yield %>

Which is pretty much a standard index.html.erb to return a list.

That is all.

Leave a Reply