Created
August 8, 2012 10:51
-
-
Save tooky/3294185 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'delegate' | |
class ProtectionProxy < SimpleDelegator | |
def initialize(object, *writable_fields) | |
super(object) | |
@writable_fields = writable_fields | |
end | |
def method_missing(method, *args, &block) | |
method_name = method.to_s | |
if !method_name.end_with?('=') | |
super | |
elsif @writable_fields.include?(method_name[0...-1].to_sym) | |
super | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rspec-given' | |
require 'delegate' | |
class ProtectionProxy < SimpleDelegator | |
def initialize(object, *writable_fields) | |
super(object) | |
@object = object | |
@writable_fields = writable_fields | |
end | |
def update_attributes(attributes={}) | |
attrs = attributes.select { |field_name| | |
@writable_fields.include?(field_name) | |
} | |
@object.update_attributes attrs | |
end | |
def method_missing(method, *args, &block) | |
method_name = method.to_s | |
if !method_name.end_with?('=') | |
super | |
elsif @writable_fields.include?(method_name[0...-1].to_sym) | |
super | |
end | |
end | |
end | |
class User < Struct.new(:name, :email, :membership_level) | |
def update_attributes(attributes={}) | |
attributes.each do |key, value| | |
send(:"#{key}=", value) | |
end | |
end | |
end | |
describe User do | |
Given(:user) { User.new("Jim", "jim@somewhere", "Beginner") } | |
When { | |
user.update_attributes(:name => "Joe", | |
:membership_level => 'Advanced') | |
} | |
Then { user.name.should == "Joe" } | |
Then { user.membership_level.should == "Advanced" } | |
end | |
describe ProtectionProxy do | |
Given(:user) { User.new("Jim", "jim@somewhere", "Beginner") } | |
Given(:proxy) { ProtectionProxy.new(user, :membership_level) } | |
Then { proxy.name.should == "Jim" } | |
context "when modifiying a writable field" do | |
When { proxy.membership_level = "Advanced" } | |
Then { proxy.membership_level.should == "Advanced" } | |
end | |
context "when modifiying a non-writable field" do | |
When { proxy.name = "Joe" } | |
Then { proxy.name.should == "Jim" } | |
end | |
context 'when update attributes is called' do | |
When { | |
proxy.update_attributes(:name => "Joe", | |
:membership_level => 'Advanced') | |
} | |
Then { proxy.membership_level.should == "Advanced" } | |
Then { proxy.name.should == "Jim" } | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rspec-given' | |
require 'protection_proxy' | |
class User < Struct.new(:name, :email, :membership_level) | |
end | |
describe ProtectionProxy do | |
Given(:user) { User.new("Jim", "jim@somewhere", "Beginner") } | |
Given(:proxy) { ProtectionProxy.new(user, :membership_level) } | |
Then { proxy.name.should == "Jim" } | |
context "when modifiying a writable field" do | |
When { proxy.membership_level = "Advanced" } | |
Then { proxy.membership_level.should == "Advanced" } | |
end | |
context "when modifiying a non-writable field" do | |
When { proxy.name = "Joe" } | |
Then { proxy.name.should == "Jim" } | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ProtectionProxy < SimpleDelegator | |
def initialize(object, *writable_fields) | |
super(object) | |
@object = object | |
@writable_fields = writable_fields | |
end | |
def update_attributes(attributes={}) | |
attrs = attributes.select { |field_name| | |
@writable_fields.include?(field_name) | |
} | |
@object.update_attributes attrs | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class UserController < ActionController::Base | |
def update | |
user = User.find(params[:id]) | |
proxy = ProtectionProxy.new(user, :name, :email) | |
if proxy.update_attributes(params[:user]) | |
# happy path | |
else | |
# error | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'delegate' | |
class Capitalise < SimpleDelegator | |
def initialize(source) | |
@source = source | |
super(source) | |
end | |
def name | |
@source.name.upcase | |
end | |
end | |
class Person < Struct.new(:name) | |
def greet | |
"Hello, #{name}" | |
end | |
end | |
john = Person.new('john') | |
capital_john = Capitalise.new(john) | |
john.greet #=> "Hello, john" | |
capital_john.greet #=> "Hello, john" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment