restful_objects 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/restful_objects.rb +1 -2
  3. data/lib/restful_objects/domain_model/domain_model.rb +14 -11
  4. data/lib/restful_objects/domain_model/helpers/link_generator.rb +102 -90
  5. data/lib/restful_objects/domain_model/mixins/object.rb +10 -13
  6. data/lib/restful_objects/domain_model/mixins/object_actions.rb +106 -117
  7. data/lib/restful_objects/domain_model/mixins/object_base.rb +175 -131
  8. data/lib/restful_objects/domain_model/mixins/object_collections.rb +58 -71
  9. data/lib/restful_objects/domain_model/mixins/object_macros.rb +20 -26
  10. data/lib/restful_objects/domain_model/mixins/object_properties.rb +85 -98
  11. data/lib/restful_objects/domain_model/mixins/service.rb +9 -17
  12. data/lib/restful_objects/domain_model/types/action_description.rb +80 -82
  13. data/lib/restful_objects/domain_model/types/collection_description.rb +39 -40
  14. data/lib/restful_objects/domain_model/types/domain_type.rb +102 -105
  15. data/lib/restful_objects/domain_model/types/parameter_description.rb +42 -47
  16. data/lib/restful_objects/domain_model/types/parameter_description_list.rb +9 -12
  17. data/lib/restful_objects/domain_model/types/property_description.rb +62 -64
  18. data/lib/restful_objects/router.rb +6 -0
  19. data/lib/restful_objects/router/base.rb +23 -32
  20. data/lib/restful_objects/router/domain_object_resources.rb +89 -94
  21. data/lib/restful_objects/router/domain_type_resources.rb +24 -29
  22. data/lib/restful_objects/router/supporting_resources.rb +26 -31
  23. data/lib/restful_objects/version.rb +1 -1
  24. data/spec/integration/domain-types_actions_spec.rb +1 -3
  25. data/spec/integration/domain-types_collections_spec.rb +1 -39
  26. data/spec/integration/domain-types_properties_spec.rb +1 -78
  27. data/spec/integration/domain-types_spec.rb +39 -0
  28. data/spec/integration/{server-root_spec.rb → homepage_spec.rb} +2 -3
  29. data/spec/integration/objects_actions_spec.rb +7 -0
  30. data/spec/integration/objects_collections_spec.rb +169 -0
  31. data/spec/integration/objects_properties_spec.rb +122 -0
  32. data/spec/{acceptance/generate_json_representations_spec.rb → integration/objects_spec.rb} +12 -4
  33. data/spec/unit/object_actions_spec.rb +5 -5
  34. data/spec/unit/object_collections_spec.rb +1 -1
  35. data/spec/unit/object_properties_spec.rb +6 -6
  36. data/spec/unit/object_spec.rb +9 -9
  37. data/spec/unit/service_spec.rb +5 -5
  38. metadata +54 -35
  39. data/spec/integration/domain_model_spec.rb +0 -35
  40. data/spec/unit/type_list_spec.rb +0 -37
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab9347453b22d38c76c2ab4c8711d1c1bd825ea4
4
- data.tar.gz: 85549e79dde2126e2871841d00d8ea64dfeced79
3
+ metadata.gz: 6daedde1839a6d282abef3882e0611a409206afc
4
+ data.tar.gz: b787995164e0c9beffde4e8cab005110daba1ffd
5
5
  SHA512:
6
- metadata.gz: 935b685a0063195caa79387cb71c7cd51377c93de88dde3a285df92413a3c5289ef3586173d67da34a2e1ea41b840036de54e1a5f7bf90ea5b1efcb18703b3b7
7
- data.tar.gz: d68969dfe27106b61abd847c742244e34160d498a1da0c44a6b0e34615aed0940edbd8c3cc3c53232e045f558384a285db4e15f44c10f32d80c712f17b516ee6
6
+ metadata.gz: ab0df304178a6f7b0a15915e13d9d8f84f279e454b1b59e374516ee6517523506d372058bd8a63fdd0fbcbc5aa78349840e24a648853c7aaabe91ea2ecb12152
7
+ data.tar.gz: d04efcf54e7e54c066117529ac0410efe3bc4c8b5cdfa56d65e8f926e0c789fb88a67c191dec05811c8aff0ce8fea076582729f6a18a98484ac781f9248cf0f6
@@ -7,6 +7,5 @@ require 'forwardable'
7
7
  require 'sinatra/base'
8
8
 
9
9
  require_relative 'restful_objects/version'
10
- require_relative 'restful_objects/router/base'
10
+ require_relative 'restful_objects/router'
11
11
  require_relative 'restful_objects/domain_model/domain_model'
12
-
@@ -54,7 +54,11 @@ module RestfulObjects
54
54
  @types[name] = DomainType.new(name)
55
55
  end
56
56
 
57
- def get_homepage
57
+ def get_homepage_representation_response
58
+ [HTTP_OK, { 'Content-Type' => 'application/json' }, get_homepage_representation.to_json]
59
+ end
60
+
61
+ def get_homepage_representation
58
62
  { 'links' => [
59
63
  link_to(:self, '/', :homepage),
60
64
  link_to(:user, '/user', :user),
@@ -62,15 +66,15 @@ module RestfulObjects
62
66
  link_to(:version, '/version', :version),
63
67
  link_to(:domain_types, '/domain-types', :type_list)
64
68
  ],
65
- 'extensions' => {}
66
- }.to_json
69
+ 'extensions' => {} }
67
70
  end
68
71
 
69
- def get_version
70
- { 'links' => [
71
- link_to(:self, '/version', :version),
72
- link_to(:up, '/', :homepage),
73
- ],
72
+ def get_version_representation_response
73
+ [HTTP_OK, { 'Content-Type' => 'application/json' }, get_version_representation.to_json]
74
+ end
75
+
76
+ def get_version_representation
77
+ { 'links' => [ link_to(:self, '/version', :version), link_to(:up, '/', :homepage) ],
74
78
  'specVersion' => '1.0',
75
79
  'optionalCapabilities' => {
76
80
  'blobsClobs' => true,
@@ -79,8 +83,7 @@ module RestfulObjects
79
83
  'protoPersistentObjects' => true,
80
84
  'validateOnly' => false
81
85
  },
82
- 'extensions' => {}
83
- }.to_json
86
+ 'extensions' => {} }
84
87
  end
85
88
 
86
89
  def get_user
@@ -130,7 +133,7 @@ module RestfulObjects
130
133
  values = []
131
134
  @services.each do |name, service|
132
135
  element = link_to(:service, "/services/#{name}", :object, service_id: name)
133
- element['title'] = service.title
136
+ element['title'] = service.ro_title
134
137
  values << element
135
138
  end
136
139
  values
@@ -1,104 +1,116 @@
1
- module RestfulObjects
2
- module LinkGenerator
3
- def link_to(rel, href, type, options = {})
4
- link = {
5
- 'rel' => generate_rel(rel, options),
6
- 'href' => RestfulObjects::DomainModel.current.base_url + href,
7
- 'type' => generate_repr_type(type, options[:domain_type], options[:element_type]),
8
- 'method' => options[:method] || 'GET' }
1
+ module RestfulObjects::LinkGenerator
2
+ HTTP_OK = 200
9
3
 
10
- link['arguments'] = options[:arguments] if options[:arguments]
4
+ def link_to(rel, href, type, options = {})
5
+ link = {
6
+ 'rel' => generate_rel(rel, options),
7
+ 'href' => RestfulObjects::DomainModel.current.base_url + href,
8
+ 'type' => generate_repr_type(type, options[:domain_type], options[:element_type]),
9
+ 'method' => options[:method] || 'GET' }
11
10
 
12
- link
13
- end
11
+ link['arguments'] = options[:arguments] if options[:arguments]
12
+
13
+ link
14
+ end
14
15
 
15
- def generate_rel(rel, options = {})
16
- if [:self, :up, :next, :previous, :icon, :help].include?(rel)
17
- rel.to_s
18
- elsif rel == :described_by
19
- 'describedby'
20
- else
21
- if [:action, :action_param, :collection, :delete, :domain_type, :domain_types, :element, :element_type, :persist,
22
- :property, :return_type, :services, :update, :user, :version].include?(rel)
23
- 'urn:org.restfulobjects:rels/' + underscore_to_hyphen_string(rel)
24
- else
25
- 'urn:org.restfulobjects:rels/' +
26
- case rel
27
- when :add_to
28
- 'add-to;collection="' + options[:collection] + '"'
29
- when :attachment
30
- 'attachment;property="' + options[:property] + '"'
31
- when :choice
32
- if options[:property]
33
- 'choice;property="' + options[:property] + '"'
34
- elsif options[:action]
35
- 'choice;action="' + options[:action] + '"'
36
- elsif options[:param]
37
- 'choice;param="' + options[:param] + '"'
38
- else
39
- raise 'option not found for choice rel'
40
- end
41
- when :clear
42
- 'clear;property="' + options[:property] + '"'
43
- when :details
44
- if options[:property]
45
- 'details;property="' + options[:property] + '"'
46
- elsif options[:collection]
47
- 'details;collection="' + options[:collection] + '"'
48
- elsif options[:action]
49
- 'details;action="' + options[:action] + '"'
50
- else
51
- raise 'option not found for details rel'
52
- end
53
- when :invoke
54
- if options[:action]
55
- 'invoke;action="' + options[:action] + '"'
56
- elsif options[:type_action]
57
- 'invoke;typeaction="' + options[:type_action] + '"'
58
- else
59
- raise 'option not found for invoke rel'
60
- end
61
- when :modify
62
- 'modify;property="' + options[:property] + '"'
63
- when :remove_from
64
- 'remove-from;collection="' + options[:collection] + '"'
65
- when :service
66
- 'service;serviceId="' + options[:service_id] + '"'
67
- when :value
68
- if options[:property]
69
- 'value;property="' + options[:property] + '"'
70
- elsif options[:collection]
71
- 'value;collection="' + options[:collection] + '"'
72
- else
73
- raise 'option not found for value rel'
74
- end
75
- else
76
- raise "rel invalid: #{rel}"
16
+ def generate_rel(rel, options = {})
17
+ if [:self, :up, :next, :previous, :icon, :help].include?(rel)
18
+ rel.to_s
19
+ elsif rel == :described_by
20
+ 'describedby'
21
+ else
22
+ if [:action, :action_param, :collection, :delete, :domain_type, :domain_types, :element, :element_type, :persist,
23
+ :property, :return_type, :services, :update, :user, :version].include?(rel)
24
+ 'urn:org.restfulobjects:rels/' + underscore_to_hyphen_string(rel)
25
+ else
26
+ 'urn:org.restfulobjects:rels/' +
27
+ case rel
28
+ when :add_to
29
+ 'add-to;collection="' + options[:collection] + '"'
30
+ when :attachment
31
+ 'attachment;property="' + options[:property] + '"'
32
+ when :choice
33
+ if options[:property]
34
+ 'choice;property="' + options[:property] + '"'
35
+ elsif options[:action]
36
+ 'choice;action="' + options[:action] + '"'
37
+ elsif options[:param]
38
+ 'choice;param="' + options[:param] + '"'
39
+ else
40
+ raise 'option not found for choice rel'
41
+ end
42
+ when :clear
43
+ 'clear;property="' + options[:property] + '"'
44
+ when :details
45
+ if options[:property]
46
+ 'details;property="' + options[:property] + '"'
47
+ elsif options[:collection]
48
+ 'details;collection="' + options[:collection] + '"'
49
+ elsif options[:action]
50
+ 'details;action="' + options[:action] + '"'
51
+ else
52
+ raise 'option not found for details rel'
77
53
  end
54
+ when :invoke
55
+ if options[:action]
56
+ 'invoke;action="' + options[:action] + '"'
57
+ elsif options[:type_action]
58
+ 'invoke;typeaction="' + options[:type_action] + '"'
59
+ else
60
+ raise 'option not found for invoke rel'
61
+ end
62
+ when :modify
63
+ 'modify;property="' + options[:property] + '"'
64
+ when :remove_from
65
+ 'remove-from;collection="' + options[:collection] + '"'
66
+ when :service
67
+ 'service;serviceId="' + options[:service_id] + '"'
68
+ when :value
69
+ if options[:property]
70
+ 'value;property="' + options[:property] + '"'
71
+ elsif options[:collection]
72
+ 'value;collection="' + options[:collection] + '"'
73
+ else
74
+ raise 'option not found for value rel'
75
+ end
76
+ else
77
+ raise "rel invalid: #{rel}"
78
78
  end
79
- end
80
79
  end
80
+ end
81
+ end
81
82
 
82
- def generate_repr_type(type, domain_type = nil, element_type = nil)
83
- valid_repr = [:homepage, :user, :version, :list, :object, :object_property, :object_collection, :object_action,
84
- :object_result, :action_result, :type_list, :domain_type, :property_description, :collection_description,
85
- :action_description, :action_param_description, :type_action_result, :error, :services]
83
+ def generate_repr_type(type, domain_type = nil, element_type = nil)
84
+ valid_repr = [:homepage, :user, :version, :list, :object, :object_property, :object_collection, :object_action,
85
+ :object_result, :action_result, :type_list, :domain_type, :property_description, :collection_description,
86
+ :action_description, :action_param_description, :type_action_result, :error, :services]
86
87
 
87
- raise "repr-type invalid: #{type.to_s}" if not valid_repr.include?(type)
88
+ raise "repr-type invalid: #{type.to_s}" if not valid_repr.include?(type)
88
89
 
89
- repr = 'application/json;profile="urn:org.restfulobjects:repr-types/' + underscore_to_hyphen_string(type) + '"'
90
+ repr = 'application/json;profile="urn:org.restfulobjects:repr-types/' + underscore_to_hyphen_string(type) + '"'
90
91
 
91
- if domain_type && [:object, :action].include?(type)
92
- repr += ';x-ro-domain-type="' + domain_type + '"'
93
- elsif element_type && [:object_collection, :action].include?(type)
94
- repr +=';x-ro-element-type="' + element_type + '"'
95
- end
92
+ if domain_type && [:object, :action].include?(type)
93
+ repr += ';x-ro-domain-type="' + domain_type + '"'
94
+ elsif element_type && [:object_collection, :action].include?(type)
95
+ repr +=';x-ro-element-type="' + element_type + '"'
96
+ end
96
97
 
97
- repr
98
- end
98
+ repr
99
+ end
99
100
 
100
- def underscore_to_hyphen_string(symbol)
101
- symbol.to_s.sub('_', '-')
102
- end
101
+ def underscore_to_hyphen_string(symbol)
102
+ symbol.to_s.sub('_', '-')
103
+ end
104
+
105
+ def ro_content_type_for_object(domain_type)
106
+ "application/json;profile=\"urn:org.restfulobjects:repr-types/object\";x-ro-domain-type=\"#{domain_type}\""
107
+ end
108
+
109
+ def ro_content_type_for_property
110
+ "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\""
111
+ end
112
+
113
+ def ro_content_type_for_object_collection(element_type)
114
+ "application/json;profile=\"urn:org.restfulobjects:repr-types/object-collection\";x-ro-element-type=\"#{element_type}\""
103
115
  end
104
116
  end
@@ -4,21 +4,18 @@ require_relative 'object_properties'
4
4
  require_relative 'object_collections'
5
5
  require_relative 'object_actions'
6
6
 
7
- module RestfulObjects
8
- module Object
9
- include LinkGenerator
7
+ module RestfulObjects::Object
8
+ include RestfulObjects::LinkGenerator
10
9
 
11
- def self.included(base)
12
- RestfulObjects::DomainModel.current.register_type(base.name)
10
+ def self.included(base)
11
+ RestfulObjects::DomainModel.current.register_type(base.name)
13
12
 
14
- base.class_eval do
15
- extend ObjectMacros
16
- include ObjectBase
17
- include ObjectProperties
18
- include ObjectCollections
19
- include ObjectActions
20
- end
13
+ base.class_eval do
14
+ extend RestfulObjects::ObjectMacros
15
+ include RestfulObjects::ObjectBase
16
+ include RestfulObjects::ObjectProperties
17
+ include RestfulObjects::ObjectCollections
18
+ include RestfulObjects::ObjectActions
21
19
  end
22
20
  end
23
21
  end
24
-
@@ -1,135 +1,124 @@
1
- module RestfulObjects
2
- module ObjectActions
3
- def actions_members
4
- members = {}
5
- rs_type.actions.each do |name, action|
6
- members[name] = {
7
- 'memberType' => 'action',
8
- 'links' => [
9
- !is_service ?
10
- link_to(:details, "/objects/#{self.class.name}/#{object_id}/actions/#{name}", :object_action, action: name)
11
- :
12
- link_to(:details, "/services/#{self.class.name}/actions/#{name}", :object_action, action: name)
13
- ],
14
- 'extensions' => action.metadata
15
- }
16
- end
17
- members
18
- end
1
+ module RestfulObjects::ObjectActions
2
+ def ro_get_action_type(name)
3
+ ro_domain_type.actions[name]
4
+ end
19
5
 
20
- def get_action(action)
21
- { 'id' => action,
22
- 'parameters' => generate_parameters(action),
23
- 'links' => [ rs_action_link(action), rs_action_up_link, rs_invoke_link(action) ],
24
- 'extensions' => rs_type.actions[action].metadata
25
- }.to_json
26
- end
6
+ def ro_get_action_response(name)
7
+ { 'id' => name,
8
+ 'parameters' => generate_parameters(name),
9
+ 'links' => [ rs_action_link(name), rs_action_up_link, rs_invoke_link(name) ],
10
+ 'extensions' => ro_get_action_type(name).metadata
11
+ }.to_json
12
+ end
27
13
 
28
- def generate_parameters(action)
29
- parameters = Hash.new
30
- rs_type.actions[action].parameters.each do |name, parameter|
31
- parameters[name] = {
32
- 'links' => [],
33
- 'extensions' => parameter.metadata
34
- }
14
+ def ro_parse_action_arguments(name, arguments, json)
15
+ result = []
16
+ ro_get_action_type(name).parameters.each do |name, parameter|
17
+ case parameter.type
18
+ when :int
19
+ result << arguments[name.to_s]['value'].to_i
20
+ else
21
+ result << arguments[name.to_s]['value']
35
22
  end
36
- parameters
37
23
  end
24
+ result
25
+ end
38
26
 
39
- def get_action_invoke(action, json)
40
- raise 'action does not exists' if not rs_type.actions.include?(action)
41
- action_description = rs_type.actions[action]
42
- json == '' ? {} : arguments = JSON.parse(json)
43
- parameters = []
44
- action_description.parameters.each do |name, parameter|
45
- case parameter.type
46
- when :int
47
- parameters << arguments[name.to_s]['value'].to_i
48
- else
49
- parameters << arguments[name.to_s]['value']
50
- end
51
- end
27
+ def ro_encode_action_result
52
28
 
53
- result = send(action.to_sym, *parameters)
29
+ end
30
+
31
+ def ro_invoke_action_and_get_response(name, json)
32
+ raise 'action does not exists' unless ro_get_action_type(name)
33
+
34
+ arguments = json == '' ? {} : JSON.parse(json)
35
+
36
+ result = send(name, *ro_parse_action_arguments(name, arguments, json))
54
37
 
55
- action_link = link_to(:self, "/objects/#{self.class.name}/#{object_id}/actions/#{action}/invoke", :action_result)
56
- action_link['arguments'] = arguments
38
+ action_link = link_to(:self, "/objects/#{self.class.name}/#{object_id}/actions/#{name}/invoke", :action_result)
39
+ action_link['arguments'] = arguments
57
40
 
58
- response = {
59
- 'links' => [ action_link ],
60
- 'resultType' => 'scalar',
61
- 'result' => {
62
- 'links' => [],
63
- 'extensions' => { }
64
- },
41
+ response = {
42
+ 'links' => [ action_link ],
43
+ 'resultType' => 'scalar',
44
+ 'result' => {
45
+ 'links' => [],
65
46
  'extensions' => { }
66
- }
67
-
68
- response['resultType'] = action_description.kind_result_type.to_s
69
- if result.nil?
70
- response['result'] = nil
71
- else
72
- case action_description.kind_result_type
73
- when :scalar
74
- response['resultType'] = 'scalar'
75
- response['result']['value'] = encode_value(result, action_description.result_type)
76
- response['result']['links'] = [ link_to(:return_type, '/domain-types/int', :domain_type) ]
77
- when :object
78
- response['resultType'] = 'object'
79
- response['result'] = result.representation
80
- when :proto_object
81
- response['resultType'] = 'object'
82
- response['result'] = result
83
- when :list
84
- response['resultType'] = 'list'
85
- response['result']['links'] =
86
- [ link_to(:element_type, "/domain-types/#{action_description.result_type.to_s}", :domain_type) ]
87
- list = []
88
- result.each do |member|
89
- member_link = link_to(:element, "/objects/#{action_description.result_type.to_s}/#{member.rs_instance_id}", :object)
90
- member_link['title'] = member.title
91
- list << member_link
92
- end
93
- response['result']['value'] = list
94
- end
95
- end
47
+ },
48
+ 'extensions' => { }
49
+ }
96
50
 
97
- response.to_json
51
+ response['resultType'] = ro_get_action_type(name).kind_result_type.to_s
52
+ if result.nil?
53
+ response['result'] = nil
54
+ else
55
+ case ro_get_action_type(name).kind_result_type
56
+ when :scalar
57
+ response['resultType'] = 'scalar'
58
+ response['result']['value'] = encode_value(result, ro_get_action_type(name).result_type)
59
+ response['result']['links'] = [ link_to(:return_type, '/domain-types/int', :domain_type) ]
60
+ when :object
61
+ response['resultType'] = 'object'
62
+ response['result'] = result.ro_get_representation
63
+ when :proto_object
64
+ response['resultType'] = 'object'
65
+ response['result'] = result
66
+ when :list
67
+ response['resultType'] = 'list'
68
+ response['result']['links'] =
69
+ [ link_to(:element_type, "/domain-types/#{ro_get_action_type(name).result_type.to_s}", :domain_type) ]
70
+ list = []
71
+ result.each do |member|
72
+ member_link = link_to(:element, "/objects/#{ro_get_action_type(name).result_type.to_s}/#{member.ro_instance_id}", :object)
73
+ member_link['title'] = member.ro_title
74
+ list << member_link
75
+ end
76
+ response['result']['value'] = list
77
+ end
98
78
  end
99
79
 
100
- def action_return_type(action)
101
- RestfulObjects::DomainModel.current.types[self.class.name].actions[action].result_type
80
+ response.to_json
81
+ end
82
+
83
+ # def action_return_type(name)
84
+ # ro_get_action_type(name).result_type
85
+ # end
86
+
87
+ protected
88
+
89
+ def generate_parameters(action_name)
90
+ result = {}
91
+ ro_get_action_type(action_name).parameters.each do |name, parameter|
92
+ result[name] = { 'links' => [], 'extensions' => parameter.metadata }
102
93
  end
94
+ result
95
+ end
103
96
 
104
- private
105
-
106
- def rs_invoke_link(action)
107
- invoke_link = is_service ?
108
- link_to(:invoke, "/services/#{rs_type.id}/actions/#{action}/invoke", :action_result, action: action)
109
- :
110
- link_to(:invoke, "/objects/#{rs_type.id}/#{object_id}/actions/#{action}/invoke", :action_result, action: action)
111
- invoke_link['arguments'] = {}
112
- rs_type.actions[action].parameters.each do |name, action|
113
- invoke_link['arguments'][name] = { 'value' => nil }
114
- end
115
- invoke_link
116
- end
97
+ def rs_invoke_link(action)
98
+ invoke_link = ro_is_service? ?
99
+ link_to(:invoke, "/services/#{ro_domain_type.id}/actions/#{action}/invoke", :action_result, action: action)
100
+ :
101
+ link_to(:invoke, "/objects/#{ro_domain_type.id}/#{object_id}/actions/#{action}/invoke", :action_result, action: action)
102
+ invoke_link['arguments'] = {}
103
+ ro_domain_type.actions[action].parameters.each do |name, action|
104
+ invoke_link['arguments'][name] = { 'value' => nil }
105
+ end
106
+ invoke_link
107
+ end
117
108
 
118
- def rs_action_link(action)
119
- if is_service
120
- link_to(:self, "/services/#{self.class.name}/actions/#{action}", :object_action)
121
- else
122
- link_to(:self, "/objects/#{self.class.name}/#{object_id}/actions/#{action}", :object_action)
123
- end
124
- end
109
+ def rs_action_link(action)
110
+ if ro_is_service?
111
+ link_to(:self, "/services/#{self.class.name}/actions/#{action}", :object_action)
112
+ else
113
+ link_to(:self, "/objects/#{self.class.name}/#{object_id}/actions/#{action}", :object_action)
114
+ end
115
+ end
125
116
 
126
- def rs_action_up_link
127
- if is_service
128
- link_to(:up, "/services/#{rs_type.id}", :object)
129
- else
130
- link_to(:up, "/objects/#{self.class.name}/#{object_id}", :object)
131
- end
132
- end
117
+ def rs_action_up_link
118
+ if ro_is_service?
119
+ link_to(:up, "/services/#{ro_domain_type.id}", :object)
120
+ else
121
+ link_to(:up, "/objects/#{self.class.name}/#{object_id}", :object)
122
+ end
133
123
  end
134
124
  end
135
-