Created
October 10, 2016 09:40
-
-
Save anonymous/a9528d1fc58daa2b6f9b4be9f77e3ceb 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
module Model | |
BaseModel = Class.new(Sequel::Model) | |
class BaseModel | |
class << self | |
def initialize_subclass(visible_fields,callable_setters) | |
@user_visible_fields = visible_fields | |
@user_callable_setters = [] | |
end | |
def inherited(sc) | |
super | |
sc.send(:initialize_subclass,@user_visible_fields || [],@user_callable_setters || []) | |
end | |
def add_user_visible_fields *args | |
@user_visible_fields += args | |
end | |
def add_user_callable_setters *args | |
@user_callable_setters += args | |
end | |
def user_safe_create params | |
model = new | |
model.set_user_writeable_fields(params) | |
model.save | |
end | |
end | |
private_class_method :initialize_subclass | |
def user_visible_fields | |
self.class.instance_variable_get(:@user_visible_fields) | |
end | |
def user_callable_setters | |
self.class.instance_variable_get(:@user_callable_setters) | |
end | |
def public_fields | |
keys.select { |k| user_visible_fields.include? k }.map { |k| [k,send(k)] }.to_h | |
end | |
def set_user_writeable_fields hash={} | |
hash.each do |k,v| | |
if user_callable_setters.include?(k) | |
meth = "#{k}=".to_sym | |
if self.respond_to?(meth) | |
self.send(meth,v) | |
end | |
else | |
puts "user tries to write user_protected field #{k} of #{self.inspect}" | |
end | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment