acts_as_api 0.0.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +11 -2
- data/Manifest.txt +0 -1
- data/README.rdoc +144 -4
- data/lib/acts_as_api.rb +1 -1
- data/lib/acts_as_api/base.rb +16 -0
- data/lib/acts_as_api/rendering.rb +7 -2
- metadata +4 -6
- data/PostInstall.txt +0 -7
data/History.txt
CHANGED
@@ -1,8 +1,17 @@
|
|
1
|
-
=== 0.
|
1
|
+
=== 0.1.4 2010-07-04
|
2
|
+
|
3
|
+
* Added better documentation.
|
4
|
+
|
5
|
+
=== 0.1.3 2010-07-04
|
6
|
+
|
7
|
+
* Support for including methods of associated models.
|
8
|
+
* Better root name determination for arrays.
|
9
|
+
|
10
|
+
=== 0.0.3 2010-07-01
|
2
11
|
|
3
12
|
* 1 small bugfix
|
4
13
|
|
5
|
-
=== 0.0.2 2010-
|
14
|
+
=== 0.0.2 2010-07-01
|
6
15
|
|
7
16
|
* 1 major enhancement:
|
8
17
|
* Added a wrapping root node for JSON responses by default.
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -2,18 +2,146 @@
|
|
2
2
|
|
3
3
|
* http://github.com/ffwdme/acts_as_api
|
4
4
|
|
5
|
-
|
6
5
|
== DESCRIPTION:
|
7
6
|
|
8
7
|
acts_as_api makes creating XML/JSON responses in Rails 3 easy and fun.
|
9
8
|
|
10
|
-
== FEATURES
|
9
|
+
== FEATURES:
|
10
|
+
|
11
|
+
The built-in XML/JSON support of Rails is great but:
|
12
|
+
|
13
|
+
You surely don't want to expose your models always with all attributes.
|
14
|
+
|
15
|
+
acts_as_api enriches the models and controllers of your app in a rails-like way so
|
16
|
+
you can easily determine how your API responses should look like.
|
11
17
|
|
12
|
-
*
|
18
|
+
acts_as_api uses the *default Rails serializers* for XML and JSON, so you don't have to
|
19
|
+
mess around with even more dependencies. Once you change the serializers for your Rails app,
|
20
|
+
they will be changed for acts_as_api too.
|
13
21
|
|
14
22
|
== SYNOPSIS:
|
15
23
|
|
16
|
-
|
24
|
+
=== Set up your model
|
25
|
+
|
26
|
+
Say you have a model +Customer+ and every customer has many +Orders+.
|
27
|
+
|
28
|
+
If you only want to expose the +firstname+ and +lastname+ attribute of a customer
|
29
|
+
via the api, you would do something like this:
|
30
|
+
|
31
|
+
|
32
|
+
class Customer < ActiveRecord::Base
|
33
|
+
|
34
|
+
has_many :orders
|
35
|
+
|
36
|
+
# let this model act as api!
|
37
|
+
acts_as_api
|
38
|
+
|
39
|
+
# define the accessible attributes/methods for the api response
|
40
|
+
api_accessible :firstname, :lastname
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
=== Set up controller
|
45
|
+
|
46
|
+
Now you just have to exchange the +render+ method in your controller for the +render_for_api+ method.
|
47
|
+
|
48
|
+
class CustomersController < ApplicationController
|
49
|
+
|
50
|
+
def show
|
51
|
+
@customer = Customer.find(params[:id])
|
52
|
+
|
53
|
+
respond_to do |format|
|
54
|
+
format.html # show.html.erb
|
55
|
+
format.xml { render_for_api :xml => @customer }
|
56
|
+
format.json { render_for_api :json => @customer }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
=== That's it!
|
63
|
+
|
64
|
+
Try it. The response should now look like this:
|
65
|
+
|
66
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
67
|
+
<customer>
|
68
|
+
<firstname>John</firstname>
|
69
|
+
<lastname>Doe</lastname>
|
70
|
+
</customer>
|
71
|
+
|
72
|
+
Other attributes of the model like +created_at+ or +updated_at+ won't be included because they were
|
73
|
+
not listed by +api_accessible+ in the model.
|
74
|
+
|
75
|
+
=== What can I include in my responses?
|
76
|
+
|
77
|
+
You can do basically anything:
|
78
|
+
|
79
|
+
* Include attributes and all other kinds of methods of your model
|
80
|
+
* Include child associations (if they also act_as_api this will be considered)
|
81
|
+
* Call methods of a parent association
|
82
|
+
* Rename attributes, methods, associations
|
83
|
+
* Create your own hierarchies
|
84
|
+
|
85
|
+
Here are two models from the example app that show how it works.
|
86
|
+
|
87
|
+
The model +Customer+ shows all kinds of ways to add data to your API response.
|
88
|
+
|
89
|
+
class Customer < ActiveRecord::Base
|
90
|
+
|
91
|
+
has_many :orders
|
92
|
+
|
93
|
+
# let this model act as api!
|
94
|
+
acts_as_api
|
95
|
+
|
96
|
+
# define the accessible attributes/methods for the api response
|
97
|
+
# some attributes of the model
|
98
|
+
api_accessible :firstname, :lastname, :age,
|
99
|
+
# you can include methods
|
100
|
+
:full_name,
|
101
|
+
# include associated model in response
|
102
|
+
:orders,
|
103
|
+
# rename the node for orders
|
104
|
+
:renamed_orders => :orders,
|
105
|
+
# put orders in another subnode
|
106
|
+
:subnode_orders => { :sub_oders => :orders },
|
107
|
+
# rename nodes/tag names
|
108
|
+
:other_node => :say_something,
|
109
|
+
# create a deeper node hierarchy
|
110
|
+
:maybe => { :useful => { :for => :say_something } }
|
111
|
+
|
112
|
+
# some example methods
|
113
|
+
def full_name
|
114
|
+
'' << firstname.to_s << ' ' << lastname.to_s
|
115
|
+
end
|
116
|
+
|
117
|
+
def say_something
|
118
|
+
"something"
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
The model +Order+ also acts as api and is even able to access a method of their parent customer.
|
124
|
+
|
125
|
+
class Order < ActiveRecord::Base
|
126
|
+
|
127
|
+
belongs_to :customer
|
128
|
+
|
129
|
+
# let this model act as api!
|
130
|
+
acts_as_api
|
131
|
+
|
132
|
+
# define the accessible attributes/methods for the api response
|
133
|
+
# some attributes of the model
|
134
|
+
api_accessible :city, :amount,
|
135
|
+
#access a method of the parent association
|
136
|
+
:parent_name => "customer.full_name"
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
=== Is there an example I can play around with?
|
142
|
+
|
143
|
+
If you want a working example right out of the box, grab the example app: http://github.com/ffwdme/acts_as_api_example
|
144
|
+
|
17
145
|
|
18
146
|
== REQUIREMENTS:
|
19
147
|
|
@@ -23,6 +151,18 @@ acts_as_api makes creating XML/JSON responses in Rails 3 easy and fun.
|
|
23
151
|
|
24
152
|
sudo gem install acts_as_api
|
25
153
|
|
154
|
+
Then add acts_as_api to the Gemfile of your Rails project
|
155
|
+
|
156
|
+
gem 'acts_as_api'
|
157
|
+
|
158
|
+
== Links
|
159
|
+
|
160
|
+
* Docs: http://rdoc.info/projects/ffwdme/acts_as_api
|
161
|
+
|
162
|
+
* Found a bug? http://github.com/ffwdme/acts_as_api/issues
|
163
|
+
|
164
|
+
* Example App: http://github.com/ffwdme/acts_as_api_example
|
165
|
+
|
26
166
|
== LICENSE:
|
27
167
|
|
28
168
|
(The MIT License)
|
data/lib/acts_as_api.rb
CHANGED
@@ -16,7 +16,7 @@ require "acts_as_api/array"
|
|
16
16
|
# acts_as_api uses the default serializers of your rails app and doesn't
|
17
17
|
# force you into more dependencies.
|
18
18
|
module ActsAsApi
|
19
|
-
VERSION = '0.
|
19
|
+
VERSION = '0.1.4'
|
20
20
|
|
21
21
|
# The accepted response formats
|
22
22
|
# Default is +[:xml, :json]+
|
data/lib/acts_as_api/base.rb
CHANGED
@@ -66,6 +66,14 @@ module ActsAsApi
|
|
66
66
|
|
67
67
|
end
|
68
68
|
|
69
|
+
when String
|
70
|
+
# go up the call chain
|
71
|
+
out = self
|
72
|
+
attribute.split(".").each do |method|
|
73
|
+
out = out.send(method.to_sym)
|
74
|
+
end
|
75
|
+
api_output[attribute] = out
|
76
|
+
|
69
77
|
when Hash
|
70
78
|
|
71
79
|
queue = []
|
@@ -91,6 +99,14 @@ module ActsAsApi
|
|
91
99
|
|
92
100
|
end
|
93
101
|
|
102
|
+
when String
|
103
|
+
# go up the call chain
|
104
|
+
out = self
|
105
|
+
v.split(".").each do |method|
|
106
|
+
out = out.send(method.to_sym)
|
107
|
+
end
|
108
|
+
leaf[:parent][k] = out
|
109
|
+
|
94
110
|
when Hash
|
95
111
|
leaf[:parent][k] ||= {}
|
96
112
|
queue << { :parent => leaf[:parent][k], :item => v}
|
@@ -28,9 +28,14 @@ module ActsAsApi
|
|
28
28
|
output_params = render_options
|
29
29
|
|
30
30
|
# set the name of the root node - pluralize for arrays
|
31
|
-
|
31
|
+
if api_model.is_a?(Array)
|
32
|
+
api_root_name = api_model.respond_to?(:name) ? api_model.name.downcase.pluralize : api_model.first.class.name.downcase.pluralize
|
33
|
+
else
|
34
|
+
api_root_name = api_model.class.name.downcase
|
35
|
+
end
|
36
|
+
|
32
37
|
|
33
|
-
output_params[:root]
|
38
|
+
output_params[:root] ||= api_root_name
|
34
39
|
|
35
40
|
api_response = api_model.as_api_response
|
36
41
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 1
|
8
|
+
- 4
|
9
|
+
version: 0.1.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "Christian B\xC3\xA4uerlein"
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-04 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -85,12 +85,10 @@ extensions: []
|
|
85
85
|
extra_rdoc_files:
|
86
86
|
- History.txt
|
87
87
|
- Manifest.txt
|
88
|
-
- PostInstall.txt
|
89
88
|
files:
|
90
89
|
- README.rdoc
|
91
90
|
- History.txt
|
92
91
|
- Manifest.txt
|
93
|
-
- PostInstall.txt
|
94
92
|
- Rakefile
|
95
93
|
- lib/acts_as_api.rb
|
96
94
|
- lib/acts_as_api/array.rb
|