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:
resources :words do collection do get 'dosearch' get 'search' end end
I then added 2 new methods to the appropriate controller:
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:
<h1>Search for word</h1> <%= render 'searchform' %> <%= link_to 'Back', words_path %>
And a _searchform.html.erb which /actually/ renders the form:
%= 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:
<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.