Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
map.resources :apis, :collection => {:ota => :post} class ApisController < ApplicationController require 'hpricot' require 'rexml/document' include REXML layout false def index render :layout => 'application' end def ota packages = [] req = params[:rq].to_s doc = Hpricot.XML(req) segments = (doc/:AvailRequestSegment) segments.each do |seg| dates = (seg/:StayDateRange) dates.each do |d| @start_date = d.attributes['Start'].to_date @end_date = d.attributes['End'].to_date end @guests = 0 (seg/:RoomStayCandidate/:GuestCount).each do |g| @guests += g.attributes['Count'].to_i end (seg/:HotelSearchCriteria/:Criterion).each do |criterion| end if @start_date.wday == 6 && @end_date > (@start_date + 5.days) cottages = [] Cottage.find(:all).each do |cottage| booked = ActiveRecord::Base.connection.select_value(" SELECT COUNT(*) FROM bookings WHERE cottage_id = #{cottage.id} AND ((start_date, end_date) OVERLAPS (DATE '#{@start_date}', DATE '#{@end_date}') = true);").to_i if booked == 0 cottages << cottage end end sleeps = 0 cottages.each{|i| sleeps += i.sleeps} if sleeps >= @guests cottages.each do |cottage| package = [] price = ActiveRecord::Base.connection.select_value(" SELECT sterling FROM prices WHERE band = #{cottage.band} AND ((start_date, end_date) OVERLAPS (DATE '#{@start_date}', DATE '#{@end_date}') = true) AND kind = 1;").to_f [@start_date,@end_date,cottage.title,price].each{|i| package << i.to_s} packages << package end end end end ota_rs(packages) end def ota_rs(packages) @uuid = "3e47ef1e-d081-11dc-ae8e-000cf10ee5d5" doc = Document.new ota = doc.add_element "OTA_HotelAvailRS" ota.add_attributes({ "xmlns" => "http://www.opentravel.org/OTA/2003/05", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.opentravel.org/2004B/OTA_HotelAvailRQ.xsd", "Version" => "1.003"}) pos = ota.add_element "pos" source = pos.add_element "source" roomstays = ota.add_element "RoomStays" packages.each do |package| roomstay = roomstays.add_element "RoomStay" roomstaytype = roomstay.add_element "RoomStayType" roomtypes = roomstaytype.add_element "RoomTypes" roomtype = roomtypes.add_element "RoomType" roomtype.add_attributes({"RoomTypeCode" => package[2]}) roomrates = roomstay.add_element "RoomRates" roomrate = roomrates.add_element "RoomRate" roomrate.add_attributes({"EffectiveDate" => package[0], "ExpireDate" => package[1]}) rate = roomrate.add_element "Rate" total = rate.add_element "Total" total.add_attributes({"AdditionalFeesExcludedIndicator" => "true", "AmountBeforeTax" => package[3], "CurrencyCode" => "GBP"}) taxes = total.add_element "Taxes" tax = taxes.add_element "Tax" fees = rate.add_element "fees" fee = fees.add_element "fee" feetaxes = fee.add_element "Taxes" feetax = feetaxes.add_element "Tax" propinfo = roomstay.add_element "BasicPropertyInfo" propinfo.add_attributes( {"ChainName"=>"lets_holiday", "HotelCode"=> '1'} ) end respond_to do |wants| wants.xml { render :xml => doc} end end end
This paste will be private.
From the Design Piracy series on my blog: