cremes.devlist@mac.com
2006-May-05 23:15 UTC
[Rails] Agile Rails (1st edition), depot TDD "exercise"
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I''ve been working my way through the Agile book and just completed the depot sample application. I learned quite a bit along the way. On page 171 we are led through the creation of a test (that fails) for new code. The new code (a search function) is left as an exercise for the reader. Well, I think I solved it but I''m not sure I did it right (even though it passes the test). After much experimentation, here''s what I did: 1. Edit the depot/app/controller/search_controller.rb file: class SearchController < ApplicationController def search @query = String.new(params[:query]) @products = Product.find(:all, :conditions => "title like ''%#{@query} %'' OR description like ''%#{@query}%''") flash[:notice] = "Found #{@products.size} product(s)." end end 2. cp depot/app/views/layout/store.rhtml depot/app/views/layout/ search.rhtml 3. cp depot/app/views/store/index.rhtml depot/app/views/search/ search.rhtml 4. Edit depot/app/views/search/search.rhtml Add in another set of <div> tags around it so we have <div class="results"> as the outermost one. It now looks like: <div class="results"> <% @products.each do |product| %> <div class="catalogentry"> <img src="<%= product.image_url %>"/> <h3><%= h product.title %></h3> <%= product.description %> <span class="catalogprice"><%= fmt_dollars(product.price) %></ span> <%= link_to ''Add to Cart'', {:action => ''add_to_cart'', :id => product }, :class => ''addtocart'' %><br/> </div> <div class="separator"> </div> <% end %> </div> <%= link_to "Show my cart", :action => "display_cart" %> 5. Change the test so it does "assert_template ''search/search''" instead of "assert_template ''search/results''". 6. There is no step six. Was there a better or easier way of accomplishing this task? Also, why did the book want to test "assert_template ''search/ results''"? That seems like an error to me. The default view for a controller''s method (action) has the same name as the action, right? Unless you do a "redirect_to :action => ''results''" in which case the "assert_response :success" would now fail because we are redirecting to a page with a different name. This really confused me and caused me to flail around much longer than necessary to solve this problem. Or is the test correct and I can have an action named "search" rendered by a view named "results"? cr -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.3 (Darwin) iD8DBQFEW9yFtEOEsNMQp04RAnLJAJ9KltH+wGA1jp4Fc+SQMUaCoDiccACeK7dM UPIxhl1BUNhanuih2h0mHJU=fk43 -----END PGP SIGNATURE-----
OK, so I had to do a couple of more installs of Rails on two new servers today. I realized that my notes were incomplete because I made a couple of mistakes in the process. So, I''ve updated my wiki page with more infomation on what I did to get this to work. These troubleshooting hints that I added should be a fairly good guide to correcting some of the most common FastCGI and Apache problems that you can encounter on any distro. http://railswiki.involution.com/ Tony