Skip to content

cjon/activeresource-response

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This gem adds possibility to access http response object from result (single object or collection) of activeresource call (methods : find, all, first, last, get )

Such functionallity can be used for easily implementing pagination in a REST API so that an ActiveResource client can navigate paginated results.

Add dependency to your Gemfile

gem "activeresource-response"

Just open your ActiveResource class and add

add_response_method :your_method_name

You can add method to ActiveResource::Base to use it in all subclasses

class ActiveResource::Base
  add_response_method :my_response  
end

You can remove method from ActiveResource subclass

class Order < ActiveResource::Base
  remove_response_method  
end

Rest Client

class Order < ActiveResource::Base
  self.format = :json
  self.site = 'http://0.0.0.0:3000/'
  self.element_name = "order" 
  add_response_method :http_response  # our new method for returned objects 
end

Server Side

class OrdersController < ApplicationController
  def index
    @orders = Order.page(params[:page]).per(params[:per_page])
    response.headers["X-total"] = @orders.total_count.to_s
    response.headers["X-offset"] = @orders.offset_value.to_s
    response.headers["X-limit"] = @orders.limit_value.to_s
    respond_with(@orders)
  end
end

Client Side

class OrdersController < ApplicationController
  def index
    orders = Order.all(:params=>params)     
    @orders = Kaminari::PaginatableArray.new(
      orders,{
              :limit => orders.http_response['X-limit'].to_i,
           	:offset =>orders.http_response['X-offset'].to_i,
           	:total_count => orders.http_response['X-total'].to_i
      }) 
  end
end

Example

class Order < ActiveResource::Base
  self.site = 'http://0.0.0.0:3000/'
  self.element_name = "order" 
  add_response_method :my_response  # our new method
end

orders = Order.all
first_order = Order.find(1) 
orders.my_response['content-length'] 
# => "3831" 
first_order.my_response['content-length'] 
#=> "260"
#connection also always has last http response object , to access it use http_response method
Order.connection.http_response.to_hash
# => {"content-type"=>["application/json; charset=utf-8"], "x-ua-compatible"=>["IE=Edge"], "etag"=>["\"573cabd02b2f1f90405f7f4f77995fab\""], "cache-control"=>["max-age=0, private, must-revalidate"], "x-request-id"=>["2911c13a0c781044c474450ed789613d"], "x-runtime"=>["0.071018"], "content-length"=>["260"], "server"=>["WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)"], "date"=>["Sun, 19 Feb 2012 10:21:29 GMT"], "connection"=>["close"]}

You can get cookies and headers from response Example

 class Country < ActiveResource::Base
   self.site = 'http://0.0.0.0:3000/'
   add_response_method :my_response  # our new method
 end
 countries = Country.all
 countries.my_response.headers

# collection with symbolized keys => {:content_type=>["application/json; charset=utf-8"], :x_ua_compatible=>["IE=Edge"], ..., :set_cookie=>["bar=foo; path=/", "foo=bar; path=/"]} 

 countries.my_response.cookies
# => {"bar"=>"foo", "foo"=>"bar"}

http response is object of Net::HTTPOK, Net::HTTPClientError or one of other subclasses of Net::HTTPResponse class. For more information see documentation www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTPResponse.html

phpblog.com.ua/2012/01/rails-activeresource-i-zagolovki/

stackoverflow.com/questions/5972429/active-resource-responses-how-to-get-them

fedoronchuk(at)gmail.com

About

Extensions to ActiveResource library. The simpliest way for REST pagination.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors