Adding search to a Rails app.

I wanted to add search to my Rails application. Here’s what I did.

1. Search code to the controller, this controller was already built using a scaffold around a Table called “Words”:

controllers/words_controller.rb:

  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

I added a view based around the index.html.erb already present. It’s basically identical:

app/views/words/search.html.erb

<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 %>

I added the following rule to config/routes.rb:

match ':controller(/:action(/:id))'

Which if I’ve understood it correctly sends any http://blah/anycontroller/action/something to the anycontroller’s action method using something as a parameter (kind of).

I can then do searches such as:

http://localhost:3000/words/search/wordtosearchfor

Notes

Will need to add a html form to perform the search (somehow).
Clearly not great if you’re code is returning a lot of search results.