Class: Protector::DSL::Meta::Box
- Inherits:
-
Object
- Object
- Protector::DSL::Meta::Box
- Defined in:
- lib/protector/dsl.rb
Overview
Single DSL evaluation result
Instance Attribute Summary collapse
-
#access ⇒ Object
Returns the value of attribute access.
-
#destroyable ⇒ Object
Returns the value of attribute destroyable.
-
#relation ⇒ Object
Returns the value of attribute relation.
-
#scope_proc ⇒ Object
Returns the value of attribute scope_proc.
Protection DSL collapse
-
#can(action, *fields) ⇒ Object
Enables action for given fields.
-
#cannot(action, *fields) ⇒ Object
Disables action for given fields.
-
#scope { ... } ⇒ Object
Activates the scope that selections will be filtered with.
Instance Method Summary collapse
-
#can?(action, field = false) ⇒ Boolean
Check whether you can perform custom action for given fields (or generally if no
fieldgiven). -
#creatable?(fields = false) ⇒ Boolean
Checks whether you can create a model with given field in context of current subject.
-
#destroyable? ⇒ Boolean
Checks whether you can destroy a model in context of current subject.
-
#initialize(model, fields, subject, entry, blocks) ⇒ Box
constructor
A new instance of Box.
-
#readable?(field) ⇒ Boolean
Checks whether given field of a model is readable in context of current subject.
-
#scoped? ⇒ Boolean
Checks whether protection with given subject has the selection scope defined.
-
#updatable?(fields = false) ⇒ Boolean
Checks whether you can update a model with given field in context of current subject.
Constructor Details
#initialize(model, fields, subject, entry, blocks) ⇒ Box
Returns a new instance of Box.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/protector/dsl.rb', line 15 def initialize(model, fields, subject, entry, blocks) @model = model @fields = fields @access = {update: {}, view: {}, create: {}} @relation = false @destroyable = false blocks.each do |b| case b.arity when 2 instance_exec subject, entry, &b when 1 instance_exec subject, &b else instance_exec &b end end end |
Instance Attribute Details
#access ⇒ Object
Returns the value of attribute access.
8 9 10 |
# File 'lib/protector/dsl.rb', line 8 def access @access end |
#destroyable ⇒ Object
Returns the value of attribute destroyable.
8 9 10 |
# File 'lib/protector/dsl.rb', line 8 def destroyable @destroyable end |
#relation ⇒ Object
Returns the value of attribute relation.
8 9 10 |
# File 'lib/protector/dsl.rb', line 8 def relation @relation end |
#scope_proc ⇒ Object
Returns the value of attribute scope_proc.
8 9 10 |
# File 'lib/protector/dsl.rb', line 8 def scope_proc @scope_proc end |
Instance Method Details
#can(action, *fields) ⇒ Object
Enables action for given fields.
Built-in possible actions are: :view, :update, :create.
You can pass any other actions you want to use with #can? afterwards.
The method enables action for every field if fields splat is empty.
Use #cannot to exclude some of them afterwards.
The list of fields can be given as a Hash. In this form you can pass Range
or Proc as a value. First will make Protector check against value inclusion.
The latter will make it evaluate given lambda (which is supposed to return true or false
determining if the value should validate or not).
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/protector/dsl.rb', line 85 def can(action, *fields) return @destroyable = true if action == :destroy @access[action] = {} unless @access[action] if fields.size == 0 @fields.each{|f| @access[action][f.to_s] = nil} else fields.each do |a| if a.is_a?(Array) a.each{|f| @access[action][f.to_s] = nil} elsif a.is_a?(Hash) @access[action].merge!(a.stringify_keys) else @access[action][a.to_s] = nil end end end end |
#can?(action, field = false) ⇒ Boolean
Check whether you can perform custom action for given fields (or generally if no field given)
156 157 158 159 160 |
# File 'lib/protector/dsl.rb', line 156 def can?(action, field=false) return false unless @access[action] return !@access[action].empty? if field === false @access[action].has_key?(field) end |
#cannot(action, *fields) ⇒ Object
Disables action for given fields.
Works similar (but oppositely) to #can.
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/protector/dsl.rb', line 113 def cannot(action, *fields) return @destroyable = false if action == :destroy return unless @access[action] if fields.size == 0 @access[action].clear else fields.each do |a| if a.is_a?(Array) a.each{|f| @access[action].delete(f.to_s)} else @access[action].delete(a.to_s) end end end end |
#creatable?(fields = false) ⇒ Boolean
Checks whether you can create a model with given field in context of current subject
138 139 140 |
# File 'lib/protector/dsl.rb', line 138 def creatable?(fields=false) modifiable? :create, fields end |
#destroyable? ⇒ Boolean
Checks whether you can destroy a model in context of current subject
148 149 150 |
# File 'lib/protector/dsl.rb', line 148 def destroyable? @destroyable end |
#readable?(field) ⇒ Boolean
Checks whether given field of a model is readable in context of current subject
133 134 135 |
# File 'lib/protector/dsl.rb', line 133 def readable?(field) @access[:view].has_key?(field) end |
#scope { ... } ⇒ Object
Activates the scope that selections will be filtered with
52 53 54 55 |
# File 'lib/protector/dsl.rb', line 52 def scope(&block) @scope_proc = block @relation = @model.instance_eval(&block) end |
#scoped? ⇒ Boolean
Checks whether protection with given subject has the selection scope defined
36 37 38 |
# File 'lib/protector/dsl.rb', line 36 def scoped? !!@relation end |
#updatable?(fields = false) ⇒ Boolean
Checks whether you can update a model with given field in context of current subject
143 144 145 |
# File 'lib/protector/dsl.rb', line 143 def updatable?(fields=false) modifiable? :update, fields end |