Class: ActiveResource::Collection

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/active_resource/collection.rb

Overview

:nodoc:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(elements = []) ⇒ Collection

ActiveResource::Collection is a wrapper to handle parsing index responses that do not directly map to Rails conventions.

You can define a custom class that inherets from ActiveResource::Collection in order to to set the elements instance.

GET /posts.json delivers following response body:

{
  posts: [
    {
      title: "ActiveResource now has associations",
      body: "Lorem Ipsum"
    }
    {...}
  ]
  next_page: "/posts.json?page=2"
}

A Post class can be setup to handle it with:

class Post < ActiveResource::Base
  self.site = "http://example.com"
  self.collection_parser = PostCollection
end

And the collection parser:

class PostCollection < ActiveResource::Collection
  attr_accessor :next_page
  def initialize(parsed = {})
    @elements = parsed['posts']
    @next_page = parsed['next_page']
  end
end

The result from a find method that returns multiple entries will now be a PostParser instance. ActiveResource::Collection includes Enumerable and instances can be iterated over just like an array.

@posts = Post.find(:all) # => PostCollection:xxx
@posts.next_page         # => "/posts.json?page=2"
@posts.map(&:id)         # =>[1, 3, 5 ...]

The initialize method will receive the ActiveResource::Formats parsed result and should set @elements.


56
57
58
# File 'lib/active_resource/collection.rb', line 56

def initialize(elements = [])
  @elements = elements
end

Instance Attribute Details

#elementsObject

The array of actual elements returned by index actions


10
11
12
# File 'lib/active_resource/collection.rb', line 10

def elements
  @elements
end

#original_paramsObject

The array of actual elements returned by index actions


10
11
12
# File 'lib/active_resource/collection.rb', line 10

def original_params
  @original_params
end

#resource_classObject

The array of actual elements returned by index actions


10
11
12
# File 'lib/active_resource/collection.rb', line 10

def resource_class
  @resource_class
end

Instance Method Details

#collect!Object Also known as: map!


64
65
66
67
68
69
70
# File 'lib/active_resource/collection.rb', line 64

def collect!
  return elements unless block_given?
  set = []
  each { |o| set << yield(o) }
  @elements = set
  self
end

#first_or_create(attributes = {}) ⇒ Object


73
74
75
76
77
# File 'lib/active_resource/collection.rb', line 73

def first_or_create(attributes = {})
  first || resource_class.create(original_params.update(attributes))
rescue NoMethodError
  raise "Cannot create resource from resource type: #{resource_class.inspect}"
end

#first_or_initialize(attributes = {}) ⇒ Object


79
80
81
82
83
# File 'lib/active_resource/collection.rb', line 79

def first_or_initialize(attributes = {})
  first || resource_class.new(original_params.update(attributes))
rescue NoMethodError
  raise "Cannot build resource from resource type: #{resource_class.inspect}"
end

#to_aObject


60
61
62
# File 'lib/active_resource/collection.rb', line 60

def to_a
  elements
end