REST API Help in Rails

Posted by dannymcc on Stack Overflow See other posts from Stack Overflow or by dannymcc
Published on 2010-06-01T16:11:30Z Indexed on 2010/06/01 16:13 UTC
Read the original article Hit count: 517

Filed under:
|
|
|

Hi Everyone,

I am trying to get some information posted using our accountancy package (FreeAgentCentral) using their API via a GEM.

http://github.com/aaronrussell/freeagent_api/

I have the following code to get it working (supposedly):

Kase Controller

def create
    @kase = Kase.new(params[:kase])
    @company = Company.find(params[:kase][:company_id])
    @kase = @company.kases.create!(params[:kase])

    respond_to do |format|
      if @kase.save
        UserMailer.deliver_makeakase("[email protected]", "Highrise", @kase)
        @kase.create_freeagent_project(current_user)

        #flash[:notice] = 'Case was successfully created.'
        flash[:notice] = fading_flash_message("Case was successfully created & sent to Highrise.", 5)

        format.html { redirect_to(@kase) }
        format.xml  { render :xml => @kase, :status => :created, :location => @kase }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @kase.errors, :status => :unprocessable_entity }
      end
    end
  end

To save you looking through, the important part is:

@kase.create_freeagent_project(current_user)

Kase Model

 # FreeAgent API Project Create
  # Required attribues
  #   :contact_id
  #   :name
  #   :payment_term_in_days
  #   :billing_basis                    # must be 1, 7, 7.5, or 8
  #   :budget_units                     # must be Hours, Days, or Monetary
  #   :status                           # must be Active or Completed
  def create_freeagent_project(current_user)
    p = Freeagent::Project.create(
      :contact_id             => 0,
      :name                   => "#{jobno} - #{highrisesubject}",
      :payment_terms_in_days  => 5,
      :billing_basis          => 1,
      :budget_units           => 'Hours',
      :status                 => 'Active'
    )
   user = Freeagent::User.find_by_email(current_user.email)
    Freeagent::Timeslip.create(
      :project_id => p.id,
      :user_id => user.id,
      :hours => 1,
      :new_task => 'Setup',
      :dated_on => Time.now
    )
  end

lib/freeagent_api.rb

require 'rubygems'
gem 'activeresource', '< 3.0.0.beta1'
require 'active_resource'

module Freeagent

  class << self
    def authenticate(options)
      Base.authenticate(options)
    end
  end

  class Error < StandardError; end

  class Base < ActiveResource::Base
    def self.authenticate(options)
      self.site = "https://#{options[:domain]}"
      self.user = options[:username]
      self.password = options[:password]
    end
  end

  # Company

  class Company
    def self.invoice_timeline
      InvoiceTimeline.find :all, :from => '/company/invoice_timeline.xml'
    end
    def self.tax_timeline
      TaxTimeline.find :all, :from => '/company/tax_timeline.xml'
    end
  end
  class InvoiceTimeline < Base
    self.prefix = '/company/'
  end
  class TaxTimeline < Base
    self.prefix = '/company/'
  end

  # Contacts

  class Contact < Base
  end

  # Projects

  class Project < Base

    def invoices
      Invoice.find :all, :from => "/projects/#{id}/invoices.xml"
    end

    def timeslips
      Timeslip.find :all, :from => "/projects/#{id}/timeslips.xml"
    end

  end

  # Tasks - Complete

  class Task < Base
    self.prefix = '/projects/:project_id/'        
  end

  # Invoices - Complete

  class Invoice < Base

    def mark_as_draft
      connection.put("/invoices/#{id}/mark_as_draft.xml", encode, self.class.headers).tap do |response|
        load_attributes_from_response(response)
      end
    end
    def mark_as_sent
      connection.put("/invoices/#{id}/mark_as_sent.xml", encode, self.class.headers).tap do |response|
        load_attributes_from_response(response)
      end
    end
    def mark_as_cancelled
      connection.put("/invoices/#{id}/mark_as_cancelled.xml", encode, self.class.headers).tap do |response|
        load_attributes_from_response(response)
      end
    end

  end

  # Invoice items - Complete

  class InvoiceItem < Base
    self.prefix = '/invoices/:invoice_id/'
  end

  # Timeslips

  class Timeslip < Base

    def self.find(*arguments)
      scope   = arguments.slice!(0)
      options = arguments.slice!(0) || {}
      if options[:params] && options[:params][:from] && options[:params][:to]
        options[:params][:view] = options[:params][:from]+'_'+options[:params][:to]
        options[:params].delete(:from)
        options[:params].delete(:to)
      end

      case scope
        when :all   then find_every(options)
        when :first then find_every(options).first
        when :last  then find_every(options).last
        when :one   then find_one(options)
        else             find_single(scope, options)
      end
    end    
  end

  # Users

  class User < Base
    self.prefix = '/company/'
    def self.find_by_email(email)
      users = User.find :all
      users.each do |u|
        u.email == email ? (return u) : next
      end
      raise Error, "No user matches that email!"
    end
  end

end

config/initializers/freeagent.rb

Freeagent.authenticate({
   :domain => 'XXXXX.freeagentcentral.com',
   :username => '[email protected]',
   :password => 'XXXXXX'
   })

The above render the following error when trying to create a new Case and send the details to FreeAgent:

ActiveResource::ResourceNotFound in KasesController#create

Failed with 404 Not Found

and

ActiveResource::ResourceNotFound (Failed with 404 Not Found):
  app/models/kase.rb:56:in `create_freeagent_project'
  app/controllers/kases_controller.rb:96:in `create'
  app/controllers/kases_controller.rb:93:in `create'

Rendered rescues/_trace (176.5ms)
Rendered rescues/_request_and_response (1.1ms)
Rendering rescues/layout (internal_server_error)

If anyone can shed any light on this problem it would be greatly appreciated!

Thanks,

Danny

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about api