Skip to content

Instantly share code, notes, and snippets.

@briandunn
Forked from joshuaclayton/aaws.rb
Created August 4, 2009 16:15
Show Gist options
  • Save briandunn/161333 to your computer and use it in GitHub Desktop.
Save briandunn/161333 to your computer and use it in GitHub Desktop.
require "hmac"
require "hmac-sha2"
# reference:
# http://docs.amazonwebservices.com/AWSECommerceService/2009-07-01/DG/index.html?BasicAuthProcess.html
# http://docs.amazonwebservices.com/AWSECommerceService/2009-07-01/DG/index.html?Query_QueryAuth.html
module AmazonSignature
def sign_request(params)
params.reverse_merge!(:Timestamp => timestamp, :Version => "2009-07-01")
params.merge!(:Signature => build_signature(params, "GET"))
params
end
private
def secret_key
"YOUR-SECRET-KEY"
end
def timestamp
Time.now.gmtime.strftime("%Y-%m-%dT%H:%M:%SZ")
end
def build_string_to_sign(params, http_verb)
returning [] do |string_to_sign|
string_to_sign << http_verb << self.base_uri.gsub(/^https?\:\/\//, "") << self.request_uri
canonicalized_params = params.sort_by {|k,v| k.to_s }.map do |kvp|
"#{aws_escape(kvp.first.to_s)}=#{aws_escape(kvp.second.to_s)}"
end.join("&")
string_to_sign << canonicalized_params
end.join("\n")
end
def build_signature(params, http_verb)
params.merge!(self.default_params)
hmac = HMAC::SHA256.new(secret_key)
hmac.update(build_string_to_sign(params, http_verb))
Base64.encode64(hmac.digest).chomp
end
def aws_escape(string)
CGI.escape(string).gsub("+", "%20").gsub("%7E", "~")
end
end
class AAWS
include HTTParty
extend AmazonSignature
base_uri "http://webservices.amazon.com"
def self.request_uri; "/onca/xml"; end
default_params :Service => "AWSECommerceService",
:ResponseGroup => "Medium",
:AWSAccessKeyId => "YOUR-ACCESS-KEY"
# reference: http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/ApiReference/ItemSearchOperation.html
def self.search(options = {})
options.reverse_merge!(:Operation => "ItemSearch", :SearchIndex => "Books")
self.get(self.request_uri, :query => sign_request(options))["ItemSearchResponse"]["Items"]
end
# reference: http://docs.amazonwebservices.com/AWSEcommerceService/2007-02-22/ApiReference/ItemLookupOperation.html
def self.find(asin, options = {})
if asin =~ /^\w{3}\-?\w{10}$/
options.merge!(:IdType => "ISBN", :SearchIndex => "Books")
asin.gsub!(/\-/, "")
end
options.reverse_merge!(:Operation => "ItemLookup", :ItemId => asin)
self.get(self.request_uri, :query => sign_request(options))["ItemLookupResponse"]["Items"]["Item"]
end
end
require "test_helper"
class AAWSTest < ActiveSupport::TestCase
should "have correct default settings" do
assert_equal({:ResponseGroup => "Medium",
:Service => "AWSECommerceService",
:AWSAccessKeyId => "YOUR-ACCESS-KEY"}, AAWS.default_params)
end
should "use the correct URI" do
assert_equal "http://webservices.amazon.com", AAWS.base_uri
end
context "performing a find" do
setup do
@asin_response = AAWSCannedResponse.asin_response
@isbn_13_response = AAWSCannedResponse.isbn_13_response
end
should "default to correct params when attempting a get" do
expected_options = has_entries(:query => has_entries(:Operation => "ItemLookup", :ItemId => "0316769177"))
AAWS.expects(:get).with("/onca/xml", expected_options).returns(@asin_response)
AAWS.find("0316769177")
end
context "for ISBN-13" do
setup do
@expected_options = has_entries(:query => has_entries(
:IdType => "ISBN",
:SearchIndex => "Books",
:Operation => "ItemLookup",
:ItemId => "9780743273565"))
end
should "handle requests with a hyphen" do
AAWS.expects(:get).with("/onca/xml", @expected_options).returns(@isbn_13_response)
AAWS.find("978-0743273565")
end
should "handle requests without a hyphen" do
AAWS.expects(:get).with("/onca/xml", @expected_options).returns(@isbn_13_response)
AAWS.find("9780743273565")
end
end
end
context "performing a search" do
setup do
@search_response = AAWSCannedResponse.search_response
@default_options = {:Operation => "ItemSearch", :Title => "Ruby on Rails"}
end
should "default search to Books" do
expected_options = has_entries(:query => has_entries(@default_options.merge(:SearchIndex => "Books")))
AAWS.expects(:get).with("/onca/xml", expected_options).returns(@search_response)
AAWS.search(:Title => "Ruby on Rails")
end
should "allow override of SearchIndex" do
expected_options = has_entries(:query => has_entries(@default_options.merge(:SearchIndex => "Audio CD")))
AAWS.expects(:get).with("/onca/xml", expected_options).returns(@search_response)
AAWS.search(:Title => "Ruby on Rails", :SearchIndex => "Audio CD")
end
should "merge any additional values passed with :query" do
expected_options = has_entries(:query => has_entries(@default_options.merge(:SearchIndex => "Books", :Author => "David Hansson")))
AAWS.expects(:get).with("/onca/xml", expected_options).returns(@search_response)
AAWS.search(:Title => "Ruby on Rails", :Author => "David Hansson")
end
end
# black-box testing for generating signatures
# reference:
# http://docs.amazonwebservices.com/AWSECommerceService/2009-07-01/DG/index.html?rest-signature.html
context "Amazon Authentication" do
should "occur when finding items" do
AAWS.stubs(:timestamp).returns("2009-01-01T12:00:00Z")
AAWS.stubs(:build_signature).returns("SIGNATURE")
expected_params = has_entries(
:query => has_entries(
:Timestamp => "2009-01-01T12:00:00Z",
:Signature => "SIGNATURE",
:Version => "2009-07-01"
)
)
AAWS.expects(:get).with("/onca/xml", expected_params).returns(AAWSCannedResponse.asin_response)
AAWS.find("0316769177")
end
should "occur when searching items" do
AAWS.stubs(:timestamp).returns("2009-01-01T12:00:00Z")
AAWS.stubs(:build_signature).returns("SIGNATURE")
expected_params = has_entries(
:query => has_entries(
:Timestamp => "2009-01-01T12:00:00Z",
:Signature => "SIGNATURE",
:Version => "2009-07-01"
)
)
AAWS.expects(:get).with("/onca/xml", expected_params).returns(AAWSCannedResponse.search_response)
AAWS.search(:Title => "Ruby on Rails")
end
should "properly generate signatures" do
AAWS.stubs(:timestamp).returns("2009-01-01T12:00:00Z")
AAWS.stubs(:secret_key).returns("1234567890")
AAWS.stubs(:default_params).returns({ :Service => "AWSECommerceService",
:AWSAccessKeyId => "00000000000000000000",
:ResponseGroup => "ItemAttributes,Offers,Images,Reviews"})
assert_equal "Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=",
AAWS.sign_request({ :Operation => "ItemLookup",
:ItemId => "0679722769",
:Version => "2009-01-06"})[:Signature]
end
should "properly generate signatures with overrides" do
AAWS.stubs(:base_uri).returns("http://ecs.amazonaws.co.uk")
AAWS.stubs(:timestamp).returns("2009-01-01T12:00:00Z")
AAWS.stubs(:secret_key).returns("1234567890")
AAWS.stubs(:default_params).returns({ :Service => "AWSECommerceService",
:AWSAccessKeyId => "00000000000000000000",
:ResponseGroup => "ItemAttributes,Offers,Images,Reviews,Variations"})
assert_equal "TuM6E5L9u/uNqOX09ET03BXVmHLVFfJIna5cxXuHxiU=",
AAWS.sign_request({ :Operation => "ItemSearch",
:SearchIndex => "DVD",
:Sort => "salesrank",
:AssociateTag => "mytag-20",
:Actor => "Johnny Depp",
:Version => "2009-01-01"})[:Signature]
end
end
end
class AAWSCannedResponse
def self.asin_response
{"ItemLookupResponse"=>{"OperationRequest"=>{"Arguments"=>{"Argument"=>[{"Name"=>"Operation", "Value"=>"ItemLookup"}, {"Name"=>"Service", "Value"=>"AWSECommerceService"}, {"Name"=>"ItemId", "Value"=>"0316769177"}, {"Name"=>"AWSAccessKeyId", "Value"=>"1D44N6064P3TNH5P28G2"}, {"Name"=>"ResponseGroup", "Value"=>"Medium"}]}, "RequestId"=>"54c1757c-1dad-4e9e-8677-3a708cd7f6f7", "RequestProcessingTime"=>"0.0215620000000000"}, "Items"=>{"Item"=>{"ItemAttributes"=>{"ISBN"=>"0316769177", "Label"=>"Back Bay Books", "NumberOfItems"=>"1", "Studio"=>"Back Bay Books", "Author"=>"J.D. Salinger", "ListPrice"=>{"FormattedPrice"=>"$13.99", "Amount"=>"1399", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2001-01-30", "Title"=>"The Catcher in the Rye", "DeweyDecimalNumber"=>"813.54", "EAN"=>"9780316769174", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Back Bay Books", "NumberOfPages"=>"288", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"20", "Length"=>"780", "Width"=>"510", "Height"=>"80"}, "Publisher"=>"Back Bay Books"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL.jpg", "Width"=>"329", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"4", "TotalUsed"=>"78", "LowestNewPrice"=>{"FormattedPrice"=>"$6.99", "Amount"=>"699", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$4.45", "Amount"=>"445", "CurrencyCode"=>"USD"}, "LowestCollectiblePrice"=>{"FormattedPrice"=>"$20.00", "Amount"=>"2000", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"56"}, "ASIN"=>"0316769177", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL._SL30_.jpg", "Width"=>"20", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL.jpg", "Width"=>"329", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL._SL75_.jpg", "Width"=>"49", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL._SL160_.jpg", "Width"=>"105", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Catcher-Rye-J-D-Salinger/dp/0316769177%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0316769177", "SalesRank"=>"269", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL._SL75_.jpg", "Width"=>"49", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>[{"Content"=>"Ever since it was first published in 1951, this novel has been the coming-of-age story against which all others are judged. Read and cherished by generations, the story of Holden Caulfield is truly one of America's literary treasures.", "Source"=>"Product Description"}, {"Content"=>"Since his debut in 1951 as <I>The Catcher in the Rye</I>, Holden Caulfield has been synonymous with \"cynical adolescent.\" Holden narrates the story of a couple of days in his sixteen-year-old life, just after he's been expelled from prep school, in a slang that sounds edgy even today and keeps this novel on banned book lists. It begins,<br> <p> \"If you really want to hear about it, the first thing you'll probably want to know is where I was born and what my lousy childhood was like, and how my parents were occupied and all before they had me, and all that David Copperfield kind of crap, but I don't feel like going into it, if you want to know the truth. In the first place, that stuff bores me, and in the second place, my parents would have about two hemorrhages apiece if I told anything pretty personal about them.\" <p> His constant wry observations about what he encounters, from teachers to phonies (the two of course are not mutually exclusive) capture the essence of the eternal teenage experience of alienation.", "Source"=>"Amazon.com Review"}]}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51LlwBORglL._SL160_.jpg", "Width"=>"105", "Height"=>"160"}}, "Request"=>{"ItemLookupRequest"=>{"OfferPage"=>"1", "DeliveryMethod"=>"Ship", "IdType"=>"ASIN", "MerchantId"=>"Amazon", "ItemId"=>"0316769177", "ReviewPage"=>"1", "Condition"=>"New", "ResponseGroup"=>"Medium"}, "IsValid"=>"True"}}, "xmlns"=>"http://webservices.amazon.com/AWSECommerceService/2005-10-05"}}
end
def self.isbn_13_response
{"ItemLookupResponse"=>{"OperationRequest"=>{"Arguments"=>{"Argument"=>[{"Name"=>"Operation", "Value"=>"ItemLookup"}, {"Name"=>"Service", "Value"=>"AWSECommerceService"}, {"Name"=>"ItemId", "Value"=>"9780743273565"}, {"Name"=>"IdType", "Value"=>"ISBN"}, {"Name"=>"AWSAccessKeyId", "Value"=>"1D44N6064P3TNH5P28G2"}, {"Name"=>"ResponseGroup", "Value"=>"Medium"}, {"Name"=>"SearchIndex", "Value"=>"Books"}]}, "RequestId"=>"f732f02f-3c53-4e38-a3a9-5cacf37f8a59", "RequestProcessingTime"=>"0.0505940000000000"}, "Items"=>{"Item"=>{"ItemAttributes"=>{"ISBN"=>"0743273567", "Label"=>"Scribner", "NumberOfItems"=>"1", "Studio"=>"Scribner", "Author"=>"F. Scott Fitzgerald", "ListPrice"=>{"FormattedPrice"=>"$14.00", "Amount"=>"1400", "CurrencyCode"=>"USD"}, "PublicationDate"=>"1999-09-30", "Title"=>"The Great Gatsby", "DeweyDecimalNumber"=>"813.52", "EAN"=>"9780743273565", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Scribner", "NumberOfPages"=>"180", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"35", "Length"=>"790", "Width"=>"520", "Height"=>"50"}, "Publisher"=>"Scribner"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L.jpg", "Width"=>"320", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"4", "TotalUsed"=>"345", "LowestNewPrice"=>{"FormattedPrice"=>"$7.00", "Amount"=>"700", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$2.53", "Amount"=>"253", "CurrencyCode"=>"USD"}, "LowestCollectiblePrice"=>{"FormattedPrice"=>"$16.55", "Amount"=>"1655", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"108"}, "ASIN"=>"0743273567", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L._SL30_.jpg", "Width"=>"19", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L.jpg", "Width"=>"320", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L._SL75_.jpg", "Width"=>"48", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L._SL160_.jpg", "Width"=>"102", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Great-Gatsby-F-Scott-Fitzgerald/dp/0743273567%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0743273567", "SalesRank"=>"177", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L._SL75_.jpg", "Width"=>"48", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>[{"Content"=>"Noted Fitzgerald biographer Matthew J. Bruccoli draws upon years of research to present the Fitzgerald's Jazz Age romance exactly as he intended according to the original manuscript, revisions, and corrections--with explanatory notes. Reprint.", "Source"=>"Product Description"}, {"Content"=>"In 1922, F. Scott Fitzgerald announced his decision to write \"something <I>new</I>--something extraordinary and beautiful and simple + intricately patterned.\" That extraordinary, beautiful, intricately patterned, and above all, simple novel became <I>The Great Gatsby</I>, arguably Fitzgerald's finest work and certainly the book for which he is best known. A portrait of the Jazz Age in all of its decadence and excess, <I>Gatsby</I> captured the spirit of the author's generation and earned itself a permanent place in American mythology. Self-made, self-invented millionaire Jay Gatsby embodies some of Fitzgerald's--and his country's--most abiding obsessions: money, ambition, greed, and the promise of new beginnings. \"Gatsby believed in the green light, the orgiastic future that year by year recedes before us. It eluded us then, but that's no matter--tomorrow we will run faster, stretch out our arms farther.... And one fine morning--\" Gatsby's rise to glory and eventual fall from grace becomes a kind of cautionary tale about the American Dream.<p> It's also a love story, of sorts, the narrative of Gatsby's quixotic passion for Daisy Buchanan. The pair meet five years before the novel begins, when Daisy is a legendary young Louisville beauty and Gatsby an impoverished officer. They fall in love, but while Gatsby serves overseas, Daisy marries the brutal, bullying, but extremely rich Tom Buchanan. After the war, Gatsby devotes himself blindly to the pursuit of wealth by whatever means--and to the pursuit of Daisy, which amounts to the same thing. \"Her voice is full of money,\" Gatsby says admiringly, in one of the novel's more famous descriptions. His millions made, Gatsby buys a mansion across Long Island Sound from Daisy's patrician East Egg address, throws lavish parties, and waits for her to appear. When she does, events unfold with all the tragic inevitability of a Greek drama, with detached, cynical neighbor Nick Carraway acting as chorus throughout. Spare, elegantly plotted, and written in crystalline prose, <I>The Great Gatsby</I> is as perfectly satisfying as the best kind of poem. ", "Source"=>"Amazon.com Review"}]}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41FNVTRGE8L._SL160_.jpg", "Width"=>"102", "Height"=>"160"}}, "Request"=>{"ItemLookupRequest"=>{"OfferPage"=>"1", "DeliveryMethod"=>"Ship", "IdType"=>"ISBN", "MerchantId"=>"Amazon", "ItemId"=>"9780743273565", "ReviewPage"=>"1", "Condition"=>"New", "ResponseGroup"=>"Medium", "SearchIndex"=>"Books"}, "IsValid"=>"True"}}, "xmlns"=>"http://webservices.amazon.com/AWSECommerceService/2005-10-05"}}
end
def self.search_response
{"ItemSearchResponse"=>{"OperationRequest"=>{"Arguments"=>{"Argument"=>[{"Name"=>"Operation", "Value"=>"ItemSearch"}, {"Name"=>"Service", "Value"=>"AWSECommerceService"}, {"Name"=>"AWSAccessKeyId", "Value"=>"1D44N6064P3TNH5P28G2"}, {"Name"=>"Title", "Value"=>"Ruby on Rails"}, {"Name"=>"ResponseGroup", "Value"=>"Medium"}, {"Name"=>"SearchIndex", "Value"=>"Books"}]}, "RequestId"=>"0fd09662-84ef-44ac-b6e0-60e43c5583a6", "RequestProcessingTime"=>"0.1217290000000000"}, "Items"=>{"TotalPages"=>"5", "Item"=>[{"ItemAttributes"=>{"ISBN"=>"0596515774", "Label"=>"O'Reilly Media, Inc.", "NumberOfItems"=>"1", "Studio"=>"O'Reilly Media, Inc.", "Author"=>"David Griffiths", "ListPrice"=>{"FormattedPrice"=>"$49.99", "Amount"=>"4999", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2009-01-02", "Title"=>"Head First Rails: A learner's companion to Ruby on Rails", "DeweyDecimalNumber"=>"005", "EAN"=>"9780596515775", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"O'Reilly Media, Inc.", "NumberOfPages"=>"462", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"185", "Length"=>"920", "Width"=>"800", "Height"=>"100"}, "Publisher"=>"O'Reilly Media, Inc."}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL.jpg", "Width"=>"432", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"12", "LowestNewPrice"=>{"FormattedPrice"=>"$14.50", "Amount"=>"1450", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$12.00", "Amount"=>"1200", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"34"}, "ASIN"=>"0596515774", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL._SL30_.jpg", "Width"=>"26", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL.jpg", "Width"=>"432", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL._SL75_.jpg", "Width"=>"65", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL._SL160_.jpg", "Width"=>"138", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Head-First-Rails-learners-companion/dp/0596515774%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596515774", "SalesRank"=>"29141", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL._SL75_.jpg", "Width"=>"65", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Ready to transport your web applications into the Web 2.0 era? <em>Head First Rails</em> takes your programming -- and productivity -- to the max. You'll learn everything from the fundamentals of Rails scaffolding to building customized interactive web apps using Rails' rich set of tools and the MVC framework.<br /> <br /> By the time you're finished, you'll have learned more than just another web framework. You'll master database interactions, integration with Ajax and XML, rich content, and even dynamic graphing of your data -- all in a fraction of the time it takes to build the same apps with Java, PHP, ASP.NET, or Perl. You'll even get comfortable and familiar with Ruby, the language that underpins Rails. But you'll do it in the context of web programming, and not through boring exercises such as \"Hello, World!\"<br /> <br /> Your time is way too valuable to waste struggling with new concepts. Using the latest research in cognitive science and learning theory to craft a multi-sensory learning experience, <em>Head First Rails</em> uses a visually rich format designed to take advantage of the way your brain really works.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51gQ8Ol15gL._SL160_.jpg", "Width"=>"138", "Height"=>"160"}}, {"ItemAttributes"=>{"ReleaseDate"=>"2006-08-22", "ISBN"=>"0596101325", "Label"=>"O'Reilly Media, Inc.", "NumberOfItems"=>"1", "Studio"=>"O'Reilly Media, Inc.", "Format"=>"Illustrated", "Author"=>["Bruce Tate", "Curt Hibbs"], "ListPrice"=>{"FormattedPrice"=>"$29.99", "Amount"=>"2999", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2006-08-01", "Title"=>"Ruby on Rails: Up and Running", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9780596101329", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"O'Reilly Media, Inc.", "NumberOfPages"=>"182", "Binding"=>"Paperback", "Edition"=>"illustrated edition", "PackageDimensions"=>{"Weight"=>"80", "Length"=>"930", "Width"=>"700", "Height"=>"50"}, "Publisher"=>"O'Reilly Media, Inc."}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL.jpg", "Width"=>"381", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"26", "LowestNewPrice"=>{"FormattedPrice"=>"$9.00", "Amount"=>"900", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$3.55", "Amount"=>"355", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"17"}, "ASIN"=>"0596101325", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL._SL30_.jpg", "Width"=>"23", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL.jpg", "Width"=>"381", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL._SL160_.jpg", "Width"=>"122", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Ruby-Rails-Running-Bruce-Tate/dp/0596101325%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596101325", "SalesRank"=>"91801", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Ruby on Rails is the super-productive new way to develop full-featured web applications. With Ruby on Rails, powerful web applications that once took weeks or months to develop can now be produced in a matter of days. If it sounds too good to be true, it isn't. <p> If you're like a lot of web developers, you've probably considered kicking the tires on Rails - the framework of choice for the new generation of Web 2.0 developers. \"Ruby on Rails: Up and Running\" takes you out for a test drive and shows you just how fast Ruby on Rails can go. <p> This compact guide teaches you the basics of installing and using both the Ruby scripting language and the Rails framework for the quick development of web applications. \"Ruby on Rails: Up and Running\" covers just about everything you need - from making a simple database-backed application to adding elaborate Ajaxian features and all the juicy bits in between. While Rails is praised for its simplicity and speed of development, there are still a few steps to master on the way. More advanced material helps you map data to an imperfect table, traverse complex relationships, and build custom finders. A section on working with Ajax and REST shows you how to exploit the Rails service frameworks to send emails, implement web services, and create dynamic user-centric web pages. The book also explains the essentials of logging to find performance problems and delves into other performance-optimizing techniques. <p> As new web development frameworks go, Ruby on Rails is the talk of the town. And \"Ruby on Rails: Up and Running\" can make sure you're in on the discussion.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51qbrSw4sGL._SL160_.jpg", "Width"=>"122", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0470069155", "Label"=>"Wrox", "NumberOfItems"=>"1", "Studio"=>"Wrox", "Author"=>"Steve Holzner Ph.D.", "ListPrice"=>{"FormattedPrice"=>"$34.99", "Amount"=>"3499", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2006-11-29", "Title"=>"Beginning Ruby on Rails (Wrox Beginning Guides)", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9780470069158", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Wrox", "NumberOfPages"=>"380", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"125", "Length"=>"1740", "Width"=>"910", "Height"=>"100"}, "Publisher"=>"Wrox"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL.jpg", "Width"=>"395", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"21", "LowestNewPrice"=>{"FormattedPrice"=>"$4.98", "Amount"=>"498", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$4.00", "Amount"=>"400", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"39"}, "ASIN"=>"0470069155", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL._SL30_.jpg", "Width"=>"24", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL.jpg", "Width"=>"395", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL._SL160_.jpg", "Width"=>"126", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Beginning-Ruby-Rails-Wrox-Guides/dp/0470069155%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470069155", "SalesRank"=>"153464", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Ruby on Rails is the revolutionary online programming tool that makes creating functional e-commerce web sites faster and easier than ever. With the intuitive, straightforward nature of Ruby and the development platform provided by Rails, you can put together full-fledged web applications quickly, even if you're new to web programming.<br> <br> You will find a thorough introduction to both Ruby and Rails in this book. You'll get the easy instructions for acquiring and installing both; understand the nature of conditionals, loops, methods, and blocks; and become familiar with Ruby's classes and objects. You'll learn to build Rails applications, connect to databases, perform necessary testing, and put the whole thing together to create real-world applications such as shopping carts and online catalogs--apps you can actually use right away.<br> <br> What you will learn from this book<br> * How to install and use Ruby and Rails<br> * Object-oriented programming with Ruby<br> * Rails fundamentals and how to create basic online applications<br> * How to work with HTML controls, use models in Rails applications, and work with sessions<br> * Details on working with databases and creating, editing, and deleting database records<br> * Methods for handling cookies and filters and for caching pages<br> * How to connect Rails with Ajax<br> <br> Who this book is for<br> <br> This book is for anyone who wants to develop online applications using Ruby and Rails. A basic understanding of programming is helpful; some knowledge of HTML is necessary.<br> <br> Wrox Beginning guides are crafted to make learning programming languages and technologies easier than you think, providing a structured, tutorial format that will guide you through all the techniques involved.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41BAq6RJ2VL._SL160_.jpg", "Width"=>"126", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0321480791", "Label"=>"Addison-Wesley Professional", "NumberOfItems"=>"1", "Studio"=>"Addison-Wesley Professional", "Author"=>["Michael Hartl", "Aurelius Prochazka"], "ListPrice"=>{"FormattedPrice"=>"$44.99", "Amount"=>"4499", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2007-07-30", "Title"=>"RailsSpace: Building a Social Networking Website with Ruby on Rails (Addison-Wesley Professional Ruby Series)", "DeweyDecimalNumber"=>"006.7", "EAN"=>"9780321480798", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Addison-Wesley Professional", "NumberOfPages"=>"537", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"290", "Length"=>"910", "Width"=>"700", "Height"=>"130"}, "Publisher"=>"Addison-Wesley Professional"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL.jpg", "Width"=>"378", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"18", "LowestNewPrice"=>{"FormattedPrice"=>"$23.99", "Amount"=>"2399", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$22.50", "Amount"=>"2250", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"30"}, "ASIN"=>"0321480791", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL._SL30_.jpg", "Width"=>"23", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL.jpg", "Width"=>"378", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL._SL160_.jpg", "Width"=>"121", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/RailsSpace-Building-Networking-Addison-Wesley-Professional/dp/0321480791%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0321480791", "SalesRank"=>"135187", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"<p>Ruby on Rails is fast displacing PHP, ASP, and J2EE as the development framework of choice for discriminating programmers, thanks to its elegant design and emphasis on practical results. <b><i>RailsSpace</i></b> teaches you to build large-scale projects with Rails by developing a real-world application: a social networking website like MySpace, Facebook, or Friendster.</p><p>Inside, the authors walk you step by step from the creation of the site's virtually static front page, through user registration and authentication, and into a highly dynamic site, complete with user profiles, image upload, email, blogs, full-text and geographical search, and a friendship request system. In the process, you learn how Rails helps you control code complexity with the model-view-controller (MVC) architecture, abstraction layers, automated testing, and code refactoring, allowing you to scale up to a large project even with a small number of developers.</p><p>This essential introduction to Rails provides</p><ul> <li>A tutorial approach that allows you to experience Rails as it is actually used </li> <li>A solid foundation for creating any login-based website in Rails</li> <li>Coverage of newer and more advanced Rails features, such as form generators, REST, and Ajax (including RJS)</li> <li>A thorough and integrated introduction to automated testing</li></ul><p>The book's companion website provides the application source code, a blog with follow-up articles, narrated screencasts, and a working version of the RailSpace social network.</p>", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51W2gZ6rlnL._SL160_.jpg", "Width"=>"121", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"047022388X", "Label"=>"Wrox", "NumberOfItems"=>"1", "Studio"=>"Wrox", "Author"=>"Noel Rappin", "ListPrice"=>{"FormattedPrice"=>"$39.99", "Amount"=>"3999", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2008-02-25", "Title"=>"Professional Ruby on Rails (Programmer to Programmer)", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9780470223888", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Wrox", "NumberOfPages"=>"457", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"140", "Length"=>"910", "Width"=>"740", "Height"=>"120"}, "Publisher"=>"Wrox"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL.jpg", "Width"=>"399", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"16", "LowestNewPrice"=>{"FormattedPrice"=>"$1.21", "Amount"=>"121", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$1.20", "Amount"=>"120", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"41"}, "ASIN"=>"047022388X", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL._SL30_.jpg", "Width"=>"24", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL.jpg", "Width"=>"399", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL._SL75_.jpg", "Width"=>"60", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL._SL160_.jpg", "Width"=>"128", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Professional-Ruby-Rails-Programmer/dp/047022388X%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D047022388X", "SalesRank"=>"429394", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL._SL75_.jpg", "Width"=>"60", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Nothing less than a revolution in the way web applications are constructed,Ruby on Rails (RoR) boasts a straightforward and intuitive nature that avoids programming repetition and makes it infinitely easier to build for the web. This book captures the current best practices to show you the most efficient way to build a spectacular web application with RoR. Youll learn everything you need to know in order to extend Rails so that you can take advantage of the many exciting and wonderful things that are being done by the diligent RoR programming community.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/416ucPUFGXL._SL160_.jpg", "Width"=>"128", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"1590598814", "Label"=>"Apress", "NumberOfItems"=>"1", "Studio"=>"Apress", "Author"=>"Ola Bini", "ListPrice"=>{"FormattedPrice"=>"$42.99", "Amount"=>"4299", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2007-09-24", "Title"=>"Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java (Expert's Voice in Java)", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9781590598818", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Apress", "NumberOfPages"=>"330", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"150", "Length"=>"920", "Width"=>"700", "Height"=>"110"}, "Publisher"=>"Apress"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL.jpg", "Width"=>"380", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"30", "LowestNewPrice"=>{"FormattedPrice"=>"$1.99", "Amount"=>"199", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$1.39", "Amount"=>"139", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"79"}, "ASIN"=>"1590598814", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL._SL30_.jpg", "Width"=>"23", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL.jpg", "Width"=>"380", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL._SL160_.jpg", "Width"=>"122", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Practical-JRuby-Rails-Web-Projects/dp/1590598814%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1590598814", "SalesRank"=>"182224", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"<p>Discover how JRuby on Rails can be used to create web applications faster and more efficiently while still taking advantage of the vast power of the Java platform. <p> <p>Ruby on Rails is proving itself to be one of the most efficient and powerful agile web development application frameworks available and has had a profound influence on the Java community. The JRuby project offers Java developers the best of two worlds: the flexibility of Ruby on Rails coupled with the enterprise-level power and maturity of the Java platform.</p> <p>JRuby core developer Ola Bini covers everything you need to know to take full advantage of what JRuby has to offer, including</p> <ul> <li>Full coverage on how to use JRuby to create web applications faster and more efficiently, while continuing to take advantage of the vast power of the Java platform</li> <li>Several real-world projects that illustrate the crucial specifics you need to know about the interaction of Java and Ruby</li> <li>Helpful, practical instruction and discussion on how web applications can be deployed using a variety of popular servers such as Apache and Mongrel</li> </ul> <h3>What youll learn</h3> <ul> <li>Create a Rails application that uses JDBC to talk to legacy databases.</li> <li>Use Java Management Extensions (JMX) to more effectively manage your application.</li> <li>Deploy a Rails application within a Java Enterprise web container (Tomcat).</li> <li>Create interoperable applications involving EJBs and Rails-driven web services.</li> <li>Securely integrate XML processing into your Ruby applications.</li> <li>Build cutting-edge Web 2.0 web sites using Rails, Prototype, and script.aculo.us to provide a pleasing user experience.</li> <li>Build four important projects: Store, CMS, Admin tool, and a web library project.</li> </ul> <h3>Who is this book for?</h3> <p>Youll get the most from this book if you have medium-to-advanced skills in Java web development, with a little Ruby experience, and are interested in taking Web development to the next level, both in terms of speed and features and in interoperability with existing infrastructure.</p> <h3>About the Apress Practical Series</h3> <p>The Practical series from Apress is your best choice for getting the job done, period. From professional to expert, this series lets you apply project-motivated templates (or frameworks) step by step in a very direct, practical, and efficient manner toward current real-world projects that may be sitting on your desk. So whatever your career goal, Apress can be your trusted guide to take you where you want to go on your IT career empowerment path.</p> <h3>Related Titles from Apress</h3> <ul> <li>Beginning POJOs: Lightweight Java Web Development Using Plain Old Java Objects in Spring, Hibernate, and Tapestry</li> <li>Beginning Ruby on Rails: From Novice to Professional</li> <li>The Definitive Guide to Grails</li> </ul>", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41OAC5IJQwL._SL160_.jpg", "Width"=>"122", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0470258225", "Label"=>"Wiley", "NumberOfItems"=>"1", "Studio"=>"Wiley", "Author"=>"Timothy Fisher", "ListPrice"=>{"FormattedPrice"=>"$44.99", "Amount"=>"4499", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2008-10-06", "Title"=>"Ruby on Rails Bible", "DeweyDecimalNumber"=>"006.7", "EAN"=>"9780470258224", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Wiley", "NumberOfPages"=>"624", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"203", "Length"=>"913", "Width"=>"732", "Height"=>"134"}, "Publisher"=>"Wiley"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL.jpg", "Width"=>"397", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"12", "LowestNewPrice"=>{"FormattedPrice"=>"$23.84", "Amount"=>"2384", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$29.39", "Amount"=>"2939", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"34"}, "ASIN"=>"0470258225", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL._SL30_.jpg", "Width"=>"24", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL.jpg", "Width"=>"397", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL._SL75_.jpg", "Width"=>"60", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL._SL160_.jpg", "Width"=>"127", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Ruby-Rails-Bible-Timothy-Fisher/dp/0470258225%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470258225", "SalesRank"=>"172721", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL._SL75_.jpg", "Width"=>"60", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Thanks to the explosive growth in popularity of the Rails framework, the equally popular Ruby programming language now has a great place to hang its hat. The powerful combination of the two provides the perfect toolset to create Web applications that feature concise code, clean syntax, and easy maintenance. This must-have book is your best guide on how to jump on the RoR bandwagon—from the basics of Ruby programming to advanced techniques for experienced Rails developers.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/510G6HV9apL._SL160_.jpg", "Width"=>"127", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0470374950", "Label"=>"Wrox", "NumberOfItems"=>"1", "Studio"=>"Wrox", "Author"=>"Antonio Cangiano", "ListPrice"=>{"FormattedPrice"=>"$49.99", "Amount"=>"4999", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2009-04-06", "Title"=>"Ruby on Rails for Microsoft Developers (Wrox Programmer to Programmer)", "DeweyDecimalNumber"=>"006.76", "EAN"=>"9780470374955", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"Wrox", "NumberOfPages"=>"480", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"150", "Length"=>"921", "Width"=>"732", "Height"=>"118"}, "Publisher"=>"Wrox"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L.jpg", "Width"=>"331", "Height"=>"420"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"7", "LowestNewPrice"=>{"FormattedPrice"=>"$22.69", "Amount"=>"2269", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$28.35", "Amount"=>"2835", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"32"}, "ASIN"=>"0470374950", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L._SL30_.jpg", "Width"=>"24", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L.jpg", "Width"=>"331", "Height"=>"420"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L._SL160_.jpg", "Width"=>"126", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Ruby-Rails-Microsoft-Developers-Programmer/dp/0470374950%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470374950", "SalesRank"=>"545662", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"This definitive guide examines how to take advantage of the new Agile methodologies offered when using Ruby on Rails (RoR). You’ll quickly grasp the RoR methodology by focusing on the RoR development from the point of view of the beginner- to intermediate-level Microsoft developer. Plus, you’ll get a reliable roadmap for migrating your applications, skill set, and development processes to the newer, more agile programming platform that RoR offers.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/41v3l2nhL9L._SL160_.jpg", "Width"=>"126", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0975841955", "Label"=>"SitePoint", "NumberOfItems"=>"1", "Studio"=>"SitePoint", "Format"=>"Illustrated", "Author"=>"Patrick Lenz", "ListPrice"=>{"FormattedPrice"=>"$39.95", "Amount"=>"3995", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2007-01-30", "Title"=>"Build Your Own Ruby on Rails Web Applications", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9780975841952", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Unknown"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"SitePoint", "NumberOfPages"=>"447", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"150", "Length"=>"900", "Width"=>"700", "Height"=>"110"}, "Publisher"=>"SitePoint"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L.jpg", "Width"=>"377", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"19", "LowestNewPrice"=>{"FormattedPrice"=>"$9.34", "Amount"=>"934", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$7.80", "Amount"=>"780", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"11"}, "ASIN"=>"0975841955", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L._SL30_.jpg", "Width"=>"23", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L.jpg", "Width"=>"377", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L._SL160_.jpg", "Width"=>"121", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Build-Your-Ruby-Rails-Applications/dp/0975841955%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0975841955", "SalesRank"=>"355778", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L._SL75_.jpg", "Width"=>"57", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"Want to learn all about Ruby on Rails, the web application framework that is inspiring developers around the world? <p> This practical hands-on guide for first-time Ruby on Rails programmers will walk you through installing the required software on a Windows, Mac or Linux computer. And before you get coding, an entire chapter is devoted to object oriented programming in Ruby, so you'll be completely confident with the Ruby language before you begin working with Rails. <p> The example application that the book builds - a user-generated news web site - is built upon with each following chapter, and concepts such as sessions, cookies and basic AJAX usage are gradually introduced. Different aspects of Rails, such as ActiveRecord, migrations and automated testing are explored with each feature that is added to the application. <p> The book finishes with chapters on debugging, benchmarking and deployment to a live web server. <p> By the end of the book, you'll have built a fully-featured Web 2.0 application and deployed it to the Web. And all code is up-to-date for Rails 1.2, so you can begin coding immediately with the latest version of Rails.", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/51QRVmc5-9L._SL160_.jpg", "Width"=>"121", "Height"=>"160"}}, {"ItemAttributes"=>{"ISBN"=>"0470081201", "Label"=>"For Dummies", "NumberOfItems"=>"1", "Studio"=>"For Dummies", "Author"=>"Barry Burd", "ListPrice"=>{"FormattedPrice"=>"$29.99", "Amount"=>"2999", "CurrencyCode"=>"USD"}, "PublicationDate"=>"2007-01-10", "Title"=>"Ruby on Rails For Dummies (For Dummies (Computer/Tech))", "DeweyDecimalNumber"=>"005.117", "EAN"=>"9780470081204", "Languages"=>{"Language"=>[{"Name"=>"English", "Type"=>"Original Language"}, {"Name"=>"English", "Type"=>"Published"}]}, "ProductGroup"=>"Book", "Manufacturer"=>"For Dummies", "NumberOfPages"=>"330", "Binding"=>"Paperback", "PackageDimensions"=>{"Weight"=>"110", "Length"=>"920", "Width"=>"740", "Height"=>"100"}, "Publisher"=>"For Dummies"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL.jpg", "Width"=>"396", "Height"=>"500"}, "OfferSummary"=>{"TotalCollectible"=>"0", "TotalUsed"=>"24", "LowestNewPrice"=>{"FormattedPrice"=>"$1.64", "Amount"=>"164", "CurrencyCode"=>"USD"}, "LowestUsedPrice"=>{"FormattedPrice"=>"$1.64", "Amount"=>"164", "CurrencyCode"=>"USD"}, "TotalRefurbished"=>"0", "TotalNew"=>"35"}, "ASIN"=>"0470081201", "ImageSets"=>{"ImageSet"=>{"SwatchImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL._SL30_.jpg", "Width"=>"24", "Height"=>"30"}, "LargeImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL.jpg", "Width"=>"396", "Height"=>"500"}, "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "Category"=>"primary", "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL._SL160_.jpg", "Width"=>"127", "Height"=>"160"}}}, "DetailPageURL"=>"http://www.amazon.com/Ruby-Rails-Dummies-Computer-Tech/dp/0470081201%3FSubscriptionId%3D1D44N6064P3TNH5P28G2%26tag%3Dws%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0470081201", "SalesRank"=>"325376", "SmallImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL._SL75_.jpg", "Width"=>"59", "Height"=>"75"}, "EditorialReviews"=>{"EditorialReview"=>{"Content"=>"<b>Quickly create Web sites with this poweful tool</b> <p> <b>Use this free and easy programming language for e-commerce sites and blogs</b> <p> If you need to build Web and database applications quickly but you don't dream in computer code, take heart! Ruby on Rails was created for you, and this book will have you up and running in no time. The Ruby scripting language and the Rails framework let you create full-featured Web applications fast. It's even fun! <p> <b>Discover how to</b> <ul> <li>Install and run Ruby and Rails <li>Use the RadRails IDE <li>Create a blog with Ruby <li>Connect your Web site to a database <li>Build a shopping cart <li>Explore Ruby's syntax </ul>", "Source"=>"Product Description"}}, "MediumImage"=>{"URL"=>"http://ecx.images-amazon.com/images/I/5127VkAT6GL._SL160_.jpg", "Width"=>"127", "Height"=>"160"}}], "Request"=>{"ItemSearchRequest"=>{"DeliveryMethod"=>"Ship", "MerchantId"=>"Amazon", "Title"=>"Ruby on Rails", "Condition"=>"New", "ResponseGroup"=>"Medium", "SearchIndex"=>"Books"}, "IsValid"=>"True"}, "TotalResults"=>"46"}, "xmlns"=>"http://webservices.amazon.com/AWSECommerceService/2005-10-05"}}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment