Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
783db25e
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
783db25e
编写于
7月 03, 2009
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Integrate AMo JSON serializer into AR
上级
d2b78b35
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
134 addition
and
172 deletion
+134
-172
activemodel/lib/active_model/attributes.rb
activemodel/lib/active_model/attributes.rb
+8
-0
activemodel/lib/active_model/serializer.rb
activemodel/lib/active_model/serializer.rb
+33
-27
activemodel/lib/active_model/serializers/json.rb
activemodel/lib/active_model/serializers/json.rb
+69
-4
activerecord/lib/active_record/serialization.rb
activerecord/lib/active_record/serialization.rb
+13
-55
activerecord/lib/active_record/serializers/json_serializer.rb
...verecord/lib/active_record/serializers/json_serializer.rb
+4
-81
activerecord/lib/active_record/serializers/xml_serializer.rb
activerecord/lib/active_record/serializers/xml_serializer.rb
+7
-5
未找到文件。
activemodel/lib/active_model/attributes.rb
浏览文件 @
783db25e
...
...
@@ -2,6 +2,14 @@
module
ActiveModel
module
Attributes
def
self
.
append_features
(
base
)
unless
base
.
instance_methods
.
include?
(
'attributes'
)
super
else
false
end
end
def
attributes
instance_values
end
...
...
activemodel/lib/active_model/serializer.rb
浏览文件 @
783db25e
...
...
@@ -8,6 +8,9 @@ class Serializer
def
initialize
(
serializable
,
options
=
nil
)
@serializable
=
serializable
@options
=
options
?
options
.
dup
:
{}
@options
[
:only
]
=
Array
.
wrap
(
@options
[
:only
]).
map
{
|
n
|
n
.
to_s
}
@options
[
:except
]
=
Array
.
wrap
(
@options
[
:except
]).
map
{
|
n
|
n
.
to_s
}
end
def
serialize
...
...
@@ -18,37 +21,40 @@ def to_s(&block)
serialize
(
&
block
)
end
protected
def
serializable_attribute_names
attribute_names
=
@serializable
.
attributes
.
keys
if
options
[
:only
]
only
=
Array
.
wrap
(
options
[
:only
]).
map
{
|
n
|
n
.
to_s
}
attribute_names
&=
only
elsif
options
[
:except
]
except
=
Array
.
wrap
(
options
[
:except
]).
map
{
|
n
|
n
.
to_s
}
attribute_names
-=
except
end
attribute_names
# To replicate the behavior in ActiveRecord#attributes,
# <tt>:except</tt> takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
# for a N level model but is set for the N+1 level models,
# then because <tt>:except</tt> is set to a default value, the second
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
# <tt>:only</tt> is set, always delete <tt>:except</tt>.
def
serializable_attribute_names
attribute_names
=
@serializable
.
attributes
.
keys
.
sort
if
options
[
:only
].
any?
attribute_names
&=
options
[
:only
]
elsif
options
[
:except
].
any?
attribute_names
-=
options
[
:except
]
end
def
serializable_method_names
Array
.
wrap
(
options
[
:methods
]).
inject
([])
do
|
methods
,
name
|
methods
<<
name
if
@serializable
.
respond_to?
(
name
.
to_s
)
methods
end
end
attribute_names
end
def
serializable_names
serializable_attribute_names
+
serializable_method_names
def
serializable_method_names
Array
.
wrap
(
options
[
:methods
]).
inject
([])
do
|
methods
,
name
|
methods
<<
name
if
@serializable
.
respond_to?
(
name
.
to_s
)
methods
end
end
def
serializable_hash
serializable_names
.
inject
({})
{
|
hash
,
name
|
hash
[
name
]
=
@serializable
.
send
(
name
)
hash
}
end
def
serializable_names
serializable_attribute_names
+
serializable_method_names
end
def
serializable_hash
serializable_names
.
inject
({})
{
|
hash
,
name
|
hash
[
name
]
=
@serializable
.
send
(
name
)
hash
}
end
end
end
activemodel/lib/active_model/serializers/json.rb
浏览文件 @
783db25e
...
...
@@ -16,10 +16,9 @@ module JSON
class
Serializer
<
ActiveModel
::
Serializer
def
serializable_hash
model
=
super
if
@serializable
.
include_root_in_json
model
=
{
@serializable
.
class
.
model_name
.
element
=>
model
}
end
model
@serializable
.
include_root_in_json
?
{
@serializable
.
class
.
model_name
.
element
=>
model
}
:
model
end
def
serialize
...
...
@@ -27,6 +26,72 @@ def serialize
end
end
# Returns a JSON string representing the model. Some configuration is
# available through +options+.
#
# The option <tt>ActiveRecord::Base.include_root_in_json</tt> controls the
# top-level behavior of to_json. In a new Rails application, it is set to
# <tt>true</tt> in initializers/new_rails_defaults.rb. When it is <tt>true</tt>,
# to_json will emit a single root node named after the object's type. For example:
#
# konata = User.find(1)
# ActiveRecord::Base.include_root_in_json = true
# konata.to_json
# # => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true} }
#
# ActiveRecord::Base.include_root_in_json = false
# konata.to_json
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true}
#
# The remainder of the examples in this section assume include_root_in_json is set to
# <tt>false</tt>.
#
# Without any +options+, the returned JSON string will include all
# the model's attributes. For example:
#
# konata = User.find(1)
# konata.to_json
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true}
#
# The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the attributes
# included, and work similar to the +attributes+ method. For example:
#
# konata.to_json(:only => [ :id, :name ])
# # => {"id": 1, "name": "Konata Izumi"}
#
# konata.to_json(:except => [ :id, :created_at, :age ])
# # => {"name": "Konata Izumi", "awesome": true}
#
# To include any methods on the model, use <tt>:methods</tt>.
#
# konata.to_json(:methods => :permalink)
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "permalink": "1-konata-izumi"}
#
# To include associations, use <tt>:include</tt>.
#
# konata.to_json(:include => :posts)
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
# {"id": 2, author_id: 1, "title": "So I was thinking"}]}
#
# 2nd level and higher order associations work as well:
#
# konata.to_json(:include => { :posts => {
# :include => { :comments => {
# :only => :body } },
# :only => :title } })
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
# "title": "Welcome to the weblog"},
# {"comments": [{"body": "Don't think too hard"}],
# "title": "So I was thinking"}]}
def
encode_json
(
encoder
)
Serializer
.
new
(
self
,
encoder
.
options
).
to_s
end
...
...
activerecord/lib/active_record/serialization.rb
浏览文件 @
783db25e
module
ActiveRecord
#:nodoc:
module
Serialization
class
Serializer
#:nodoc:
attr_reader
:options
def
initialize
(
record
,
options
=
nil
)
@record
=
record
@options
=
options
?
options
.
dup
:
{}
end
# To replicate the behavior in ActiveRecord#attributes,
# <tt>:except</tt> takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
# for a N level model but is set for the N+1 level models,
# then because <tt>:except</tt> is set to a default value, the second
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
# <tt>:only</tt> is set, always delete <tt>:except</tt>.
def
serializable_attribute_names
attribute_names
=
@record
.
attribute_names
if
options
[
:only
]
options
.
delete
(
:except
)
attribute_names
=
attribute_names
&
Array
.
wrap
(
options
[
:only
]).
collect
{
|
n
|
n
.
to_s
}
else
options
[
:except
]
=
Array
.
wrap
(
options
[
:except
])
|
Array
.
wrap
(
@record
.
class
.
inheritance_column
)
attribute_names
=
attribute_names
-
options
[
:except
].
collect
{
|
n
|
n
.
to_s
}
end
attribute_names
end
def
serializable_method_names
Array
.
wrap
(
options
[
:methods
]).
inject
([])
do
|
method_attributes
,
name
|
method_attributes
<<
name
if
@record
.
respond_to?
(
name
.
to_s
)
method_attributes
end
end
def
serializable_names
serializable_attribute_names
+
serializable_method_names
module
RecordSerializer
#:nodoc:
def
initialize
(
*
args
)
super
options
[
:except
]
|=
Array
.
wrap
(
@serializable
.
class
.
inheritance_column
)
end
# Add associations specified via the <tt>:includes</tt> option.
...
...
@@ -53,11 +20,11 @@ def add_includes(&block)
associations
=
include_has_options
?
include_associations
.
keys
:
Array
.
wrap
(
include_associations
)
for
association
in
associations
records
=
case
@
record
.
class
.
reflect_on_association
(
association
).
macro
records
=
case
@
serializable
.
class
.
reflect_on_association
(
association
).
macro
when
:has_many
,
:has_and_belongs_to_many
@
record
.
send
(
association
).
to_a
@
serializable
.
send
(
association
).
to_a
when
:has_one
,
:belongs_to
@
record
.
send
(
association
)
@
serializable
.
send
(
association
)
end
unless
records
.
nil?
...
...
@@ -71,28 +38,19 @@ def add_includes(&block)
end
end
def
serializable_record
record
=
{}
serializable_names
.
each
{
|
name
|
record
[
name
]
=
@record
.
send
(
name
)
}
def
serializable_hash
hash
=
super
add_includes
do
|
association
,
records
,
opts
|
record
[
association
]
=
hash
[
association
]
=
if
records
.
is_a?
(
Enumerable
)
records
.
collect
{
|
r
|
self
.
class
.
new
(
r
,
opts
).
serializable_
record
}
records
.
collect
{
|
r
|
self
.
class
.
new
(
r
,
opts
).
serializable_
hash
}
else
self
.
class
.
new
(
records
,
opts
).
serializable_
record
self
.
class
.
new
(
records
,
opts
).
serializable_
hash
end
end
record
end
def
serialize
# overwrite to implement
end
def
to_s
(
&
block
)
serialize
(
&
block
)
hash
end
end
end
...
...
activerecord/lib/active_record/serializers/json_serializer.rb
浏览文件 @
783db25e
require
'active_support/json'
require
'active_model/naming'
module
ActiveRecord
#:nodoc:
module
Serialization
extend
ActiveSupport
::
Concern
include
ActiveModel
::
Serializers
::
JSON
included
do
cattr_accessor
:include_root_in_json
,
:instance_writer
=>
false
class
JSONSerializer
<
ActiveModel
::
Serializers
::
JSON
::
Serializer
include
Serialization
::
RecordSerializer
end
# Returns a JSON string representing the model. Some configuration is
# available through +options+.
#
# The option <tt>ActiveRecord::Base.include_root_in_json</tt> controls the
# top-level behavior of to_json. In a new Rails application, it is set to
# <tt>true</tt> in initializers/new_rails_defaults.rb. When it is <tt>true</tt>,
# to_json will emit a single root node named after the object's type. For example:
#
# konata = User.find(1)
# ActiveRecord::Base.include_root_in_json = true
# konata.to_json
# # => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true} }
#
# ActiveRecord::Base.include_root_in_json = false
# konata.to_json
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true}
#
# The remainder of the examples in this section assume include_root_in_json is set to
# <tt>false</tt>.
#
# Without any +options+, the returned JSON string will include all
# the model's attributes. For example:
#
# konata = User.find(1)
# konata.to_json
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true}
#
# The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the attributes
# included, and work similar to the +attributes+ method. For example:
#
# konata.to_json(:only => [ :id, :name ])
# # => {"id": 1, "name": "Konata Izumi"}
#
# konata.to_json(:except => [ :id, :created_at, :age ])
# # => {"name": "Konata Izumi", "awesome": true}
#
# To include any methods on the model, use <tt>:methods</tt>.
#
# konata.to_json(:methods => :permalink)
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "permalink": "1-konata-izumi"}
#
# To include associations, use <tt>:include</tt>.
#
# konata.to_json(:include => :posts)
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
# {"id": 2, author_id: 1, "title": "So I was thinking"}]}
#
# 2nd level and higher order associations work as well:
#
# konata.to_json(:include => { :posts => {
# :include => { :comments => {
# :only => :body } },
# :only => :title } })
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
# "created_at": "2006/08/01", "awesome": true,
# "posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
# "title": "Welcome to the weblog"},
# {"comments": [{"body": "Don't think too hard"}],
# "title": "So I was thinking"}]}
def
encode_json
(
encoder
)
hash
=
Serializer
.
new
(
self
,
encoder
.
options
).
serializable_record
hash
=
{
self
.
class
.
model_name
.
element
=>
hash
}
if
include_root_in_json
ActiveSupport
::
JSON
.
encode
(
hash
)
end
def
as_json
(
options
=
nil
)
self
end
#:nodoc:
def
from_json
(
json
)
self
.
attributes
=
ActiveSupport
::
JSON
.
decode
(
json
)
self
JSONSerializer
.
new
(
self
,
encoder
.
options
).
to_s
end
end
end
activerecord/lib/active_record/serializers/xml_serializer.rb
浏览文件 @
783db25e
...
...
@@ -164,7 +164,9 @@ def from_xml(xml)
end
end
class
XmlSerializer
<
ActiveRecord
::
Serialization
::
Serializer
#:nodoc:
class
XmlSerializer
<
ActiveModel
::
Serializer
#:nodoc:
include
Serialization
::
RecordSerializer
def
builder
@builder
||=
begin
require
'builder'
unless
defined?
::
Builder
...
...
@@ -181,7 +183,7 @@ def builder
end
def
root
root
=
(
options
[
:root
]
||
@
record
.
class
.
to_s
.
underscore
).
to_s
root
=
(
options
[
:root
]
||
@
serializable
.
class
.
to_s
.
underscore
).
to_s
reformat_name
(
root
)
end
...
...
@@ -199,12 +201,12 @@ def reformat_name(name)
end
def
serializable_attributes
serializable_attribute_names
.
collect
{
|
name
|
Attribute
.
new
(
name
,
@
record
)
}
serializable_attribute_names
.
collect
{
|
name
|
Attribute
.
new
(
name
,
@
serializable
)
}
end
def
serializable_method_attributes
Array
(
options
[
:methods
]).
inject
([])
do
|
method_attributes
,
name
|
method_attributes
<<
MethodAttribute
.
new
(
name
.
to_s
,
@
record
)
if
@record
.
respond_to?
(
name
.
to_s
)
method_attributes
<<
MethodAttribute
.
new
(
name
.
to_s
,
@
serializable
)
if
@serializable
.
respond_to?
(
name
.
to_s
)
method_attributes
end
end
...
...
@@ -254,7 +256,7 @@ def add_associations(association, records, opts)
end
end
else
if
record
=
@
record
.
send
(
association
)
if
record
=
@
serializable
.
send
(
association
)
record
.
to_xml
(
opts
.
merge
(
:root
=>
association
))
end
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录