Class: ActionWebService::Struct

Inherits:
Object
  • Object
show all
Defined in:
lib/action_web_service/struct.rb

Overview

To send structured types across the wire, derive from ActionWebService::Struct, and use member to declare structure members.

ActionWebService::Struct should be used in method signatures when you want to accept or return structured types that have no Active Record model class representations, or you don’t want to expose your entire Active Record model to remote callers.

Example

class Person < ActionWebService::Struct
  member :id,         :int
  member :firstnames, [:string]
  member :lastname,   :string
  member :email,      :string,	:nillable => true
end
person = Person.new(:id => 5, :firstname => 'john', :lastname => 'doe')

Active Record model classes are already implicitly supported in method signatures.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values = {}, check_hash = false) ⇒ Struct

If a Hash is given as argument to an ActionWebService::Struct constructor, it can contain initial values for the structure member. Values passed within the Hash that do not reflect member within the Struct will raise a NoMethodError unless the optional check_hash boolean is true.



27
28
29
30
31
# File 'lib/action_web_service/struct.rb', line 27

def initialize(values={}, check_hash = false)
  if values.is_a?(Hash)
    values.map { |k,v| __send__("#{k}=", v) unless (check_hash &&  !self.respond_to?("#{k}=") ) }
  end
end

Class Method Details

.member(name, type, options = {}) ⇒ Object

Creates a structure member with the specified name and type. Additional wsdl schema properties may be specified in the optional hash options. Generates accessor methods for reading and writing the member value.



52
53
54
55
56
57
58
59
60
# File 'lib/action_web_service/struct.rb', line 52

def member(name, type, options={})
  name = name.to_sym
  type = ActionWebService::SignatureTypes.canonical_signature_entry({ name => type }, 0)
  self.struct_members = self.struct_members.merge({ name => [type, options] })
  class_eval <<-END
    def #{name}; @#{name}; end
    def #{name}=(value); @#{name} = value; end
  END
end

.member_type(name) ⇒ Object

:nodoc:



66
67
68
69
# File 'lib/action_web_service/struct.rb', line 66

def member_type(name) # :nodoc:
  type, options = members[name.to_sym]
  type
end

.membersObject

:nodoc:



62
63
64
# File 'lib/action_web_service/struct.rb', line 62

def members # :nodoc:
  self.struct_members
end

Instance Method Details

#[](name) ⇒ Object

The member with the given name



34
35
36
# File 'lib/action_web_service/struct.rb', line 34

def [](name)
  send(name.to_s)
end

#each_pair(&block) ⇒ Object

Iterates through each member



39
40
41
42
43
# File 'lib/action_web_service/struct.rb', line 39

def each_pair(&block)
  self.class.members.each do |name, type|
    yield name, self.__send__(name)
  end
end