Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions lib/model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,24 @@ def key(symbol, &block)
end
end

def initialize(hash={})
unknown = hash.keys - keys
if unknown.count > 0
raise ArgumentError, "unknown keyword#{'s' if unknown.count > 1}: #{unknown.join', '}"
end
hash.each_pair {|key, v| instance_variable_set "@#{key}", v}
def initialize(hash=nil)
hash ||= {}
update(hash)

(self.class.defaults.keys - hash.keys).each do |key|
block = self.class.defaults[key]
instance_variable_set("@#{key}", instance_exec(&block))
end
end

def update(hash)
unknown = hash.keys - keys
if unknown.count > 0
raise ArgumentError, "unknown keyword#{'s' if unknown.count > 1}: #{unknown.join', '}"
end
hash.each {|key, v| instance_variable_set "@#{key}", v}
end

def keys
self.class.keys
end
Expand Down
8 changes: 8 additions & 0 deletions spec/model_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,12 @@ class OwnerModel < UserModel
expect(user2).to_not eql user1
end

it 'can update model values with a hash' do
address = AddressModel.new
address.update(street1: '1101 Fifth St',
street2: 'Suite 300')
expect(address.street1).to eql '1101 Fifth St'
expect(address.street2).to eql 'Suite 300'
end

end