class AppBase::ModelConcern::ModelConcernHelper
Public Class Methods
new(model)
click to toggle source
# File lib/appbase/model_concern.rb, line 111 def initialize(model) @model = model end
Private Class Methods
[](model)
click to toggle source
# File lib/appbase/model_concern.rb, line 117 def [](model) raise "Invalid model" if model.class != Class helpers[model] ||= ModelConcernHelper.new(model) end
helpers()
click to toggle source
# File lib/appbase/model_concern.rb, line 123 def helpers @helpers ||= {} end
Public Instance Methods
crud_allow(crud, criteria=:mine, &block)
click to toggle source
# File lib/appbase/model_concern.rb, line 80 def crud_allow(crud, criteria=:mine, &block) validate_crud crud if criteria == :mine allow_mine crud else key = crud == :query ? :within : :if if criteria.instance_of? Hash allow_criteria_with_method_alias(crud, criteria[key]) else show_usage(crud) if criteria != key || !block_given? allow_criteria_with_block(crud, block) end end AppBase::Registry.register_crud @model, crud end
symbol_array_manipulate(op, source, options)
click to toggle source
# File lib/appbase/model_concern.rb, line 97 def symbol_array_manipulate(op, source, options) raise InvalidUsage if op != :only && op != :except if options.has_key? op operands = options[op] operands = [operands] if operands.instance_of?(String) || operands.instance_of?(Symbol) raise InvalidUsage unless operands.instance_of?(Array) operands = operands.map {|c|c.to_sym} source.send({ only: '&', except: "-" }[op], operands) else source end end
Private Instance Methods
allow_criteria_with_block(crud, block)
click to toggle source
# File lib/appbase/model_concern.rb, line 57 def allow_criteria_with_block(crud, block) show_usage(crud) if crud == :query && block.parameters.count != 1 show_usage(crud) if crud != :query && block.parameters.count != 2 model_inject crud == :query ? :accessible_by : "allow_#{crud}", &block end
allow_criteria_with_method_alias(crud, method_name)
click to toggle source
# File lib/appbase/model_concern.rb, line 63 def allow_criteria_with_method_alias(crud, method_name) show_usage(crud) if method_name.nil? || !method_name.instance_of?(Symbol) model_inject do |user_identity_attr| crud == :query ? %- def self.accessible_by(user) #{@model.name}.#{method_name} user end - : %- def self.allow_#{crud}?(user, obj) #{@model.name}.#{method_name} user, obj end - end end
allow_mine(crud)
click to toggle source
# File lib/appbase/model_concern.rb, line 43 def allow_mine(crud) model_inject do |user_identity_attr| crud == :query ? %- def self.accessible_by(user) #{@model.name}.where(:#{user_identity_attr} => user.id) end - : %- def self.allow_#{crud}?(user, obj) user.id == obj.#{user_identity_attr} end - end end
model_inject(method_name=nil, &block)
click to toggle source
# File lib/appbase/model_concern.rb, line 20 def model_inject(method_name=nil, &block) AppBase::Engine.after_initialized do user_identity_attr = "#{AppBase::Engine::UserIdentity.underscore}_id" if method_name.nil? method_body = block.call(user_identity_attr) @model.class_eval method_body else @model.define_singleton_method method_name.to_sym, &block end end end
show_usage(crud)
click to toggle source
# File lib/appbase/model_concern.rb, line 32 def show_usage(crud) raise %- allow_#{crud} usage: allow_#{crud} :mine allow_#{crud} :#{ crud == :query ? 'within' : 'if' } => :a_singleton_method allow_#{crud} :#{ crud == :query ? 'within' : 'if' } do |current_user_identity#{ crud == :query ? '' : ', model_instance' }| # #{ crud == :query ? 'return fitlered query, e.g. Note.where(:user_id => current_user_identity.id)' : 'return true if allowed' } end - end
validate_crud(crud)
click to toggle source
# File lib/appbase/model_concern.rb, line 14 def validate_crud(crud) if [:create, :update, :delete, :query].index(crud).nil? raise "Unsupported crud operation: #{crud}, available options: create, update, delete, query" end end