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