https://github.com/rails/activeresource
Connects business objects and REST web services
https://github.com/rails/activeresource
Keywords from Contributors
activerecord activejob mvc rubygems rack sinatra rspec crash-reporting ruby-gem devise
Last synced: about 16 hours ago
JSON representation
Repository metadata
Connects business objects and REST web services
- Host: GitHub
- URL: https://github.com/rails/activeresource
- Owner: rails
- License: mit
- Created: 2012-03-13T21:09:47.000Z (about 14 years ago)
- Default Branch: main
- Last Pushed: 2026-01-06T18:54:14.000Z (5 months ago)
- Last Synced: 2026-05-15T21:44:01.741Z (8 days ago)
- Language: Ruby
- Homepage:
- Size: 1.17 MB
- Stars: 1,400
- Watchers: 41
- Forks: 363
- Open Issues: 11
- Releases: 9
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: MIT-LICENSE
README.md
Active Resource
Active Resource (ARes) connects business objects and Representational State Transfer (REST)
web services. It implements object-relational mapping for REST web services to provide transparent
proxying capabilities between a client (Active Resource) and a RESTful service (which is provided by
RESTful routing in ActionDispatch::Routing::Mapper::Resources).
Philosophy
Active Resource attempts to provide a coherent wrapper object-relational mapping for REST
web services. It follows the same philosophy as Active Record, in that one of its prime aims
is to reduce the amount of code needed to map to these resources. This is made possible
by relying on a number of code- and protocol-based conventions that make it easy for Active Resource
to infer complex relations and structures. These conventions are outlined in detail in the documentation
for ActiveResource::Base.
Overview
Model classes are mapped to remote REST resources by Active Resource much the same way Active Record maps
model classes to database tables. When a request is made to a remote resource, a REST JSON request is
generated, transmitted, and the result received and serialized into a usable Ruby object.
Download and installation
The latest version of Active Resource can be installed with RubyGems:
gem install activeresource
Or added to a Gemfile:
gem 'activeresource'
Source code can be downloaded on GitHub
Configuration and Usage
Putting Active Resource to use is very similar to Active Record. It's as simple as creating a model class
that inherits from ActiveResource::Base and providing a site class variable to it:
class Person < ActiveResource::Base
self.site = "http://api.people.com:3000"
end
Now the Person class is REST enabled and can invoke REST services very similarly to how Active Record invokes
life cycle methods that operate against a persistent store.
# Find a person with id = 1
tyler = Person.find(1)
Person.exists?(1) # => true
As you can see, the methods are quite similar to Active Record's methods for dealing with database
records. But rather than dealing directly with a database record, you're dealing with HTTP resources
(which may or may not be database records).
Connection settings (site, headers, user, password, bearer_token, proxy) and the connections
themselves are store in thread-local variables to make them thread-safe, so you can also set these
dynamically, even in a multi-threaded environment, for instance:
ActiveResource::Base.site = api_site_for(request)
Authentication
Active Resource supports the token based authentication provided by Rails through the
ActionController::HttpAuthentication::Token class using custom headers.
class Person < ActiveResource::Base
self.headers['Authorization'] = 'Token token="abcd"'
end
You can also set any specific HTTP header using the same way. As mentioned above, headers are
thread-safe, so you can set headers dynamically, even in a multi-threaded environment:
ActiveResource::Base.headers['Authorization'] = current_session_api_token
Active Resource supports 2 options for HTTP authentication today.
- Basic
class Person < ActiveResource::Base
self.user = 'my@email.com'
self.password = '123'
end
# username: my@email.com password: 123
- Bearer Token
class Person < ActiveResource::Base
self.auth_type = :bearer
self.bearer_token = 'my-token123'
end
# Bearer my-token123
Protocol
Active Resource is built on a standard JSON or XML format for requesting and submitting resources
over HTTP. It mirrors the RESTful routing built into Action Controller but will also work with any
other REST service that properly implements the protocol. REST uses HTTP, but unlike "typical" web
applications, it makes use of all the verbs available in the HTTP specification:
- GET requests are used for finding and retrieving resources.
- POST requests are used to create new resources.
- PUT requests are used to update existing resources.
- DELETE requests are used to delete resources.
For more information on how this protocol works with Active Resource, see the ActiveResource::Base documentation;
for more general information on REST web services, see the article
here.
Find
Find requests use the GET method and expect the JSON form of whatever resource/resources is/are
being requested. So, for a request for a single element, the JSON of that item is expected in
response:
# Expects a response of
#
# {"id":1,"first_name":"Tyler","last_name":"Durden"}
#
# for GET http://api.people.com:3000/people/1.json
#
tyler = Person.find(1)
The JSON document that is received is used to build a new object of type Person, with each
JSON element becoming an attribute on the object.
tyler.is_a? Person # => true
tyler.last_name # => 'Durden'
Any complex element (one that contains other elements) becomes its own object:
# With this response:
# {"id":1,"first_name":"Tyler","address":{"street":"Paper St.","state":"CA"}}
#
# for GET http://api.people.com:3000/people/1.json
#
tyler = Person.find(1)
tyler.address # => <Person::Address::xxxxx>
tyler.address.street # => 'Paper St.'
Collections can also be requested in a similar fashion
# Expects a response of
#
# [
# {"id":1,"first_name":"Tyler","last_name":"Durden"},
# {"id":2,"first_name":"Tony","last_name":"Stark",}
# ]
#
# for GET http://api.people.com:3000/people.json
#
people = Person.all
people.first # => <Person::xxx 'first_name' => 'Tyler' ...>
people.last # => <Person::xxx 'first_name' => 'Tony' ...>
Collections can be filtered with query parameters
# Expects a response of
#
# [
# {"id":1,"first_name":"Tyler","last_name":"Durden"},
# ]
#
# for GET http://api.people.com:3000/people.json?last_name=Durden
#
people = Person.where(last_name: "Durden")
people.first # => <Person::xxx 'first_name' => 'Tyler' ...>
A note on finding all resources
Previously, Active Resource would eagerly load resources when Person.all was called. This behaviour is now
deprecated and Active Resource now lazy loads collections. The http request is deferred until the collection is
explicitly accessed.
You can opt-in to the new behaviour by setting the ActiveResource::Base.lazy_collections = false.
Note that this setting is temporary to allow your application to progressivly transition to the new behaviour.
This setting will be removed in the next versions of Active Resource.
Create
Creating a new resource submits the JSON form of the resource as the body of the request and expects
a 'Location' header in the response with the RESTful URL location of the newly created resource. The
id of the newly created resource is parsed out of the Location response header and automatically set
as the id of the ARes object.
# {"first_name":"Tyler","last_name":"Durden"}
#
# is submitted as the body on
#
# if include_root_in_json is not set or set to false => {"first_name":"Tyler"}
# if include_root_in_json is set to true => {"person":{"first_name":"Tyler"}}
#
# POST http://api.people.com:3000/people.json
#
# when save is called on a new Person object. An empty response is
# is expected with a 'Location' header value:
#
# Response (201): Location: http://api.people.com:3000/people/2
#
tyler = Person.new(:first_name => 'Tyler')
tyler.new? # => true
tyler.save # => true
tyler.new? # => false
tyler.id # => 2
Update
'save' is also used to update an existing resource and follows the same protocol as creating a resource
with the exception that no response headers are needed -- just an empty response when the update on the
server side was successful.
# {"first_name":"Tyler"}
#
# is submitted as the body on
#
# if include_root_in_json is not set or set to false => {"first_name":"Tyler"}
# if include_root_in_json is set to true => {"person":{"first_name":"Tyler"}}
#
# PUT http://api.people.com:3000/people/1.json
#
# when save is called on an existing Person object. An empty response is
# is expected with code (204)
#
tyler = Person.find(1)
tyler.first_name # => 'Tyler'
tyler.first_name = 'Tyson'
tyler.save # => true
Delete
Destruction of a resource can be invoked as a class and instance method of the resource.
# A request is made to
#
# DELETE http://api.people.com:3000/people/1.json
#
# for both of these forms. An empty response with
# is expected with response code (200)
#
tyler = Person.find(1)
tyler.destroy # => true
tyler.exists? # => false
Person.delete(2) # => true
Person.exists?(2) # => false
Validations
Resources validate their attributes with Active Model validations. When a
resource is invalid, it will not issue a request:
class Post < ActiveResource::Base
self.site = "http://blog.io"
validates :title, presence: true
end
post = Post.create(title: "") # does not issue POST http://blog.io/posts.json request
post.valid? # => false
post.errors[:title] # => ["can't be blank"]
When a resource is valid but the server responds with an error, Active Resource
will add error messages in the style of Active Model validations:
class Post < ActiveResource::Base
self.site = "http://blog.io"
validates :title, presence: true
end
post = Post.create(title: "This Post is not Unique!") # issues a POST http://blog.io/posts.json request
# => {"errors":{"title":"is taken"}}
post.valid? # => false
post.errors[:title] # => ["is taken"]
Associations
Relationships between resources can be declared using the standard association syntax
that should be familiar to anyone who uses Active Record. For example, using the
class definition below:
class Post < ActiveResource::Base
self.site = "http://blog.io"
has_many :comments
end
post = Post.find(1) # issues GET http://blog.io/posts/1.json
comments = post.comments # issues GET http://blog.io/comments.json?post_id=1
In this case, the Comment model would have to be implemented as Active Resource, too.
If you control the server, you may wish to include nested resources thus avoiding a
second network request. Given the resource above, if the response includes comments
in the response, they will be automatically loaded into the Active Resource object.
The server-side model can be adjusted as follows to include comments in the response.
class Post < ActiveRecord::Base
has_many :comments
def as_json(options)
super.merge(:include=>[:comments])
end
end
Logging
Active Resource instruments the event request.active_resource when doing a request
to the remote service. You can subscribe to it by doing:
ActiveSupport::Notifications.subscribe('request.active_resource') do |name, start, finish, id, payload|
The payload is a Hash with the following keys:
requestas a Net::HTTPRequestmethodas aSymbolrequest_urias aStringheadersas aHashbodyas aStringwhen availableresultas a Net::HTTPResponse
License
Active Resource is released under the MIT license:
Contributing to Active Resource
Active Resource is work of many contributors. You're encouraged to submit pull requests, propose
features and discuss issues.
See CONTRIBUTING.
Support
Full API documentation is available at
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
You can find more usage information in the ActiveResource::Base documentation.
Owner metadata
- Name: Ruby on Rails
- Login: rails
- Email:
- Kind: organization
- Description:
- Website: https://rubyonrails.org/
- Location:
- Twitter:
- Company:
- Icon url: https://avatars.githubusercontent.com/u/4223?v=4
- Repositories: 116
- Last ynced at: 2023-04-09T03:40:20.529Z
- Profile URL: https://github.com/rails
GitHub Events
Total
- Release event: 1
- Pull request event: 59
- Fork event: 5
- Issues event: 4
- Watch event: 48
- Issue comment event: 33
- Push event: 32
- Pull request review event: 41
- Pull request review comment event: 44
- Create event: 3
Last Year
- Release event: 1
- Pull request event: 41
- Fork event: 2
- Issues event: 3
- Watch event: 15
- Issue comment event: 16
- Push event: 29
- Pull request review comment event: 16
- Pull request review event: 20
- Create event: 2
Committers metadata
Last synced: 1 day ago
Total Commits: 911
Total Committers: 234
Avg Commits per committer: 3.893
Development Distribution Score (DDS): 0.873
Commits in past year: 59
Committers in past year: 6
Avg Commits per committer in past year: 9.833
Development Distribution Score (DDS) in past year: 0.339
| Name | Commits | |
|---|---|---|
| Jeremy Kemper | j****y@b****t | 116 |
| Rafael Mendonça França | r****a@g****m | 73 |
| David Heinemeier Hansson | d****d@l****m | 61 |
| Sean Doyle | s****4@g****m | 42 |
| Xavier Noria | f****n@h****m | 27 |
| Joshua Peek | j****h@j****m | 26 |
| Rick Olson | t****e@g****m | 25 |
| Santiago Pastorino | s****o@w****m | 25 |
| Pratik Naik | p****k@g****m | 17 |
| José Valim | j****m@g****m | 15 |
| Arun Agrawal | a****w@g****m | 14 |
| Jean Boussier | j****r@g****m | 13 |
| Akira Matsuda | r****e@d****p | 11 |
| Jeffrey Hardy | p****f@g****m | 10 |
| Prem Sichanugrist | s@s****m | 10 |
| Gaston Ramos | r****n@g****m | 9 |
| Vijay Dev | v****e@g****m | 8 |
| Josh Kalderimis | j****s@g****m | 8 |
| Guillermo Iguaran | g****n@g****m | 8 |
| Phil Murray | p****y@n****z | 7 |
| Aaron Patterson | a****n@g****m | 7 |
| Carl Lerche | c****e@m****m | 7 |
| Michael Hewson | m****l@m****a | 7 |
| Denzel Morris | d****1@g****m | 6 |
| Sebastian Martinez | s****n@w****m | 6 |
| Seth Faxon | s****n@g****m | 6 |
| Emilio Tagua | m****s@g****m | 6 |
| taryn | t****t@g****k | 6 |
| Neeraj Singh | n****e@g****m | 6 |
| Markus Schwed | m****d@g****m | 6 |
| and 204 more... | ||
Committer domains:
- shopify.com: 6
- jadedpixel.com: 3
- rewind.io: 2
- wyeworks.com: 2
- pobox.com: 2
- squareup.com: 2
- 37signals.com: 2
- engineyard.com: 2
- vernix.org: 1
- aspgems.com: 1
- redhat.com: 1
- zerosum.org: 1
- okayfail.com: 1
- tractical.com: 1
- pm.me: 1
- railway.at: 1
- sourcebits.com: 1
- verrot.fr: 1
- stanford.edu: 1
- methodmissing.com: 1
- hypothetical.com.au: 1
- suse.cz: 1
- jonathanleighton.com: 1
- leereilly.net: 1
- bitsweat.net: 1
- loudthinking.com: 1
- hashref.com: 1
- joshpeek.com: 1
- dio.jp: 1
- sikachu.com: 1
- nevada.net.nz: 1
- mac.com: 1
- michaelhewson.ca: 1
- globalpersonals.co.uk: 1
- me.com: 1
- geoffgarside.co.uk: 1
- koziarski.com: 1
- balvig.com: 1
- brynary.com: 1
- changehealthcare.com: 1
- taryneast.org: 1
- whiskeyandgrits.net: 1
- maisweb.org: 1
- pivotallabs.com: 1
- where.com: 1
- rakuten.com: 1
- ericlathrop.com: 1
- baldurian.net: 1
- comcast.net: 1
- carllerche.com: 1
- brettdgibson.com: 1
- sporkmonger.com: 1
- odd-e.com: 1
- smile.io: 1
- beautifulpixel.com: 1
- mugnolo.com: 1
- aaronglenn.ca: 1
- mariakravtsova.us: 1
- infotechinc.com: 1
- korstiaan.com: 1
- spacebabies.nl: 1
- niedfeldt.com: 1
- u2i.com: 1
- jakimowicz.com: 1
- peertransfer.com: 1
- dhcppc1.(none): 1
- shotwell.flood.pivotallabs.com: 1
- vishnuatrai.com: 1
- melbourne.co.uk: 1
- sweetyhigh.com: 1
- maintainedauto.com: 1
- squaremouth.com: 1
- trantorinc.com: 1
- omar.engineer: 1
- paridans.com: 1
- mcgill.ca: 1
- ralfebert.de: 1
- itech.ee: 1
- makandra.de: 1
- jonathanmoss.me: 1
- larkfarm.com: 1
- thrivesmart.com: 1
- digidentity.eu: 1
- animoto.com: 1
- dtrasbo.com: 1
Issue and Pull Request metadata
Last synced: 15 days ago
Total issues: 61
Total pull requests: 135
Average time to close issues: 4 months
Average time to close pull requests: 3 months
Total issue authors: 51
Total pull request authors: 55
Average comments per issue: 3.13
Average comments per pull request: 0.84
Merged pull request: 73
Bot issues: 0
Bot pull requests: 0
Past year issues: 2
Past year pull requests: 38
Past year average time to close issues: N/A
Past year average time to close pull requests: 8 days
Past year issue authors: 2
Past year pull request authors: 7
Past year average comments per issue: 0.0
Past year average comments per pull request: 0.39
Past year merged pull request: 17
Past year bot issues: 0
Past year bot pull requests: 0
Top Issue Authors
- noctivityinc (4)
- tolgap (2)
- luk4s (2)
- simmerz (2)
- ivan05almeida (2)
- ktimothy (2)
- fabianof (2)
- marisveide (2)
- andyw8 (1)
- cmarkle (1)
- poloka (1)
- voxik (1)
- ravi-bebble (1)
- igor-ladkin (1)
- JohnSmall (1)
Top Pull Request Authors
- seanpdoyle (57)
- casperisfine (6)
- balvig (5)
- josedonizetti (3)
- Schwad (3)
- rafaelfranca (3)
- Earlopain (2)
- adrian-gomez (2)
- islue (2)
- jlurena (2)
- Volosh1n (2)
- ivan05almeida (2)
- muhammadnawzad (2)
- igor-ladkin (2)
- gmcgibbon (2)
Top Issue Labels
- stale (25)
Top Pull Request Labels
- stale (14)
- need more info (1)
Package metadata
- Total packages: 2
-
Total downloads:
- rubygems: 177,618,693 total
- Total docker downloads: 1,669,946
- Total dependent packages: 405 (may contain duplicates)
- Total dependent repositories: 179,603 (may contain duplicates)
- Total versions: 320
- Total maintainers: 11
- Total advisories: 2
gem.coop: activeresource
REST on Rails. Wrap your RESTful web app with Ruby classes and work with them like Active Record models.
- Homepage: http://www.rubyonrails.org
- Documentation: http://www.rubydoc.info/gems/activeresource/
- Licenses: MIT
- Latest release: 6.2.0 (published 8 months ago)
- Last Synced: 2026-05-22T21:31:16.323Z (about 24 hours ago)
- Versions: 160
- Dependent Packages: 0
- Dependent Repositories: 0
- Downloads: 88,815,979 Total
- Docker Downloads: 834,973
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 0.154%
- Downloads: 0.463%
- Maintainers (11)
- Advisories:
rubygems.org: activeresource
REST on Rails. Wrap your RESTful web app with Ruby classes and work with them like Active Record models.
- Homepage: http://www.rubyonrails.org
- Documentation: http://www.rubydoc.info/gems/activeresource/
- Licenses: MIT
- Latest release: 6.2.0 (published 8 months ago)
- Last Synced: 2026-05-22T06:01:31.570Z (1 day ago)
- Versions: 160
- Dependent Packages: 405
- Dependent Repositories: 179,603
- Downloads: 88,802,714 Total
- Docker Downloads: 834,973
-
Rankings:
- Dependent repos count: 0.098%
- Dependent packages count: 0.112%
- Downloads: 0.227%
- Average: 0.878%
- Forks count: 1.439%
- Stargazers count: 1.651%
- Docker downloads count: 1.738%
- Maintainers (11)
- Advisories:
Dependencies
- actions/checkout v2 composite
- ruby/setup-ruby v1 composite
- actions/checkout v2 composite
- ruby/setup-ruby v1 composite
- mcr.microsoft.com/vscode/devcontainers/ruby 0-${VARIANT} build
- ruby-prof >= 0 development
- minitest-bisect >= 0
- rubocop >= 0
- rubocop-minitest >= 0
- rubocop-packaging >= 0
- rubocop-performance >= 0
- rubocop-rails >= 0
- mocha >= 0.13.0 development
- rake >= 0 development
- rexml >= 0 development
- activemodel >= 6.0
- activemodel-serializers-xml ~> 1.0
- activesupport >= 6.0
Score: 31.712886934975366