Happy St. Patrick's day! Today I'm am going to leave another quick post, but rest assured, I will post another update this weekend. Ruby on Rails is really showing some admirable characteristics for its ease of use. I am going to quickly go over conditional statements (in their simplest form) and a quick implementation of a search box that utilizes ajax (you should see it on this page).
The first part is going to be quick and simple, but hopefully it might save someone some time. For every "if" should have a corresponding "end" tag. If you require an "else" just put it in the middle somewhere. And finally - the one that got me is:
An else-if is entered exactly as so: elsif (without the e!!!)
This little detail had me held up for a good ten minutes (until I did a quick google). It is a slight annoyance, but sense it does remove the need for one more letter I can't complain too much. However, my ide RadRails highlighted it everytime it typed else-if, so I thought it wasn't the problem for those few minutes.
As for searching, allow me to briefly go over what you will need (which includes that really neat ajax effect). So lets start, first off - we need to include the javascript files into our layout (or view, I chose the layout for all my views). Just insert the following into the layout:
<%= javascript_include_tag :defaults %>
That short include tag brings in all the necessary javascript files - now we need to add a form in the view we want to search from (my search form is in the page I want to search through - the index page). So inside your form tag use this snippet to prepare your view for searching:
<%= text_field_with_auto_complete :thought, :keywords %>
Where :thought is the model/table you wish to search for matching objects, and :keywords is the field you wish to perform your search on.
Now you have the front peices ready to go, and if you were to try and use them, you would unfortunately get nowhere. This is where we will need to add a special RoR tag into our controller that handles this request. So in my corresponding controller I will put this one line outside of any method:
auto_complete_for :thought, :keywords
In my setup, the form is submiting the search data to the same method (the index method). To handle the search terms (and find the corresponding records) I setup my index method like so:
def index
if !params[:thought]
@posts = Thought.find(:all, :order => "id DESC")
else
@posts = Thought.find(:all, :conditions => ["keywords = ?", params[:thought][:keywords]])
end
end
So I check to see if there were submitted params then query the database to retrieve the records with the exact keywords. Simple enough!
There is one problem with this setup - My users have to submit the exact keywords (ie, they have to select one of the selections the ajax call presents). This is a poor design, and needs improvement, but for the sake of learning how to make the ajax search happen, it will do fine for now.
Perhaps next post I can go over how to improve the search feature. In the meantime check out the new Rails Recipes book over at the Pragmatic Programmer book store.
