trust 0.8.3 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -1
  3. data/lib/trust.rb +9 -0
  4. data/lib/trust/authorization.rb +83 -36
  5. data/lib/trust/controller.rb +32 -8
  6. data/lib/trust/controller/properties.rb +12 -0
  7. data/lib/trust/controller/resource.rb +79 -11
  8. data/lib/trust/permissions.rb +177 -24
  9. data/lib/trust/version.rb +1 -1
  10. data/test/dummy/app/controllers/accounts_controller.rb +2 -2
  11. data/test/dummy/app/controllers/clients_controller.rb +1 -1
  12. data/test/dummy/app/controllers/mongo_accounts_controller.rb +5 -4
  13. data/test/dummy/app/controllers/mongo_clients_controller.rb +1 -1
  14. data/test/dummy/app/controllers/users_controller.rb +1 -5
  15. data/test/dummy/app/models/account.rb +1 -1
  16. data/test/dummy/app/models/client.rb +1 -1
  17. data/test/dummy/app/models/permissions.rb +18 -11
  18. data/test/dummy/app/models/user.rb +1 -1
  19. data/test/dummy/app/views/accounts/edit.html.erb +1 -1
  20. data/test/dummy/app/views/accounts/show.html.erb +1 -1
  21. data/test/dummy/app/views/mongo_accounts/_form.html.erb +1 -1
  22. data/test/dummy/app/views/mongo_accounts/edit.html.erb +2 -2
  23. data/test/dummy/app/views/mongo_accounts/index.html.erb +3 -3
  24. data/test/dummy/app/views/mongo_accounts/show.html.erb +2 -2
  25. data/test/dummy/bin/bundle +3 -0
  26. data/test/dummy/bin/rails +4 -0
  27. data/test/dummy/bin/rake +4 -0
  28. data/test/dummy/bin/setup +29 -0
  29. data/test/dummy/config/application.rb +3 -34
  30. data/test/dummy/config/boot.rb +4 -9
  31. data/test/dummy/config/environment.rb +3 -3
  32. data/test/dummy/config/environments/development.rb +22 -18
  33. data/test/dummy/config/environments/production.rb +46 -34
  34. data/test/dummy/config/environments/test.rb +19 -14
  35. data/test/dummy/config/initializers/assets.rb +11 -0
  36. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  37. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  38. data/test/dummy/config/initializers/inflections.rb +6 -5
  39. data/test/dummy/config/initializers/mime_types.rb +0 -1
  40. data/test/dummy/config/initializers/session_store.rb +1 -6
  41. data/test/dummy/config/initializers/wrap_parameters.rb +6 -6
  42. data/test/dummy/config/locales/en.yml +20 -2
  43. data/test/dummy/config/mongoid.yml +16 -18
  44. data/test/dummy/config/routes.rb +3 -3
  45. data/test/dummy/config/secrets.yml +22 -0
  46. data/test/dummy/db/test.sqlite3 +0 -0
  47. data/test/dummy/log/development.log +30 -0
  48. data/test/dummy/log/test.log +6382 -0
  49. data/test/dummy/test/functional/accounts_controller_test.rb +2 -2
  50. data/test/dummy/test/functional/mongo_accounts_controller_test.rb +8 -8
  51. data/test/dummy/test/functional/mongo_clients_controller_test.rb +1 -1
  52. data/test/dummy/test/unit/permissions_test.rb +1 -1
  53. data/test/dummy/tmp/cache/assets/test/sprockets/0e74e8595d4c5c03160356ab9bf6f67c +0 -0
  54. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  55. data/test/dummy/tmp/cache/assets/test/sprockets/189460d2a0f63f35d55c384e0beb9cc4 +0 -0
  56. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  57. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  58. data/test/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  59. data/test/dummy/tmp/cache/assets/test/sprockets/4050a4e5062ab95c9f32e9b6940821ea +0 -0
  60. data/test/dummy/tmp/cache/assets/test/sprockets/5f1a0d05e77ca8b9a1fc2a47e17a8174 +0 -0
  61. data/test/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  62. data/test/dummy/tmp/cache/assets/test/sprockets/75f67b2244ba6a4914d71df068f5fda9 +0 -0
  63. data/test/dummy/tmp/cache/assets/test/sprockets/7ed0985e7e627ac5280078ee9c7078fe +0 -0
  64. data/test/dummy/tmp/cache/assets/test/sprockets/86d19eda31629412e6817570ffde9a93 +0 -0
  65. data/test/dummy/tmp/cache/assets/test/sprockets/87b209c0c9da28094a8d5581a21262c6 +0 -0
  66. data/test/dummy/tmp/cache/assets/test/sprockets/954318d0d3412eec67db5c2508ae5169 +0 -0
  67. data/test/dummy/tmp/cache/assets/test/sprockets/95c1a034126598a432130d7fc227c189 +0 -0
  68. data/test/dummy/tmp/cache/assets/test/sprockets/b55283b385e5692ecf1b59332bbc5a11 +0 -0
  69. data/test/dummy/tmp/cache/assets/test/sprockets/b678ce3482f77c68a19e697960645cb6 +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/ca9d9c205bcfa05de1ddd180f8ecc168 +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/d36f675d4251ea3868635d299f3bb166 +0 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/f56253b5f374fff1a33fbbc9881c9124 +0 -0
  75. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  76. data/test/dummy/tmp/cache/assets/test/sprockets/fe1f20fb032685e2e1fcad23f0ad6601 +0 -0
  77. data/test/test_helper.rb +6 -2
  78. data/test/trust_test.rb +4 -0
  79. data/test/unit/trust/authorization_test.rb +165 -71
  80. data/test/unit/trust/controller/properties_test.rb +15 -0
  81. data/test/unit/trust/controller/resource_test.rb +29 -9
  82. data/test/unit/trust/controller_test.rb +53 -40
  83. data/test/unit/trust/permissions_test.rb +196 -69
  84. metadata +93 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bea262c912622b51eaedfc53386184b45cdd8a04
4
- data.tar.gz: 1ad4cc3eb35a3d7805cc0c4a9188b6c305834031
3
+ metadata.gz: 5f4f6f8b277d792ad153c664b08a0dedf92d6ef4
4
+ data.tar.gz: 498d30e412516e48c926724fca6a1425a40e4264
5
5
  SHA512:
6
- metadata.gz: 5c7fca96476142ca771e324a1bdc184f6d77a12b5b585160b522ebb205086e9361614b9a00d7b0de9ac066d3e35e02ff5fd953bb77621d617e3454b7afffa620
7
- data.tar.gz: 8573bc74bc4824c35c78a11d387d2c46e12f568c387aa4828fbe919b6b56f3748456c2de94698227e85d65b0be34c305c690d697c01d9f021885a696f78095a6
6
+ metadata.gz: f0ff733d503944e905020986f6acb716dffa5a5b325d8d4752f0f3e34704df25e6cf5069e67fe18c6dcecad1d81ceb4d17d0934c210a144caf88ec7012e3e386
7
+ data.tar.gz: c9ebe76c73d95820d0a3151e466624e9b6a3e08793fae6e2801a3c9735a8eab46b89ce6909f2c6222d4663a127cd4479c896d842b6d922acfa198185f68fe856
data/README.md CHANGED
@@ -59,9 +59,33 @@ module Permissions
59
59
  parent && parent.is_a?(Client) && parent.operators.find(user.id)
60
60
  end
61
61
  end
62
+
63
+
64
+ class Voucher < Default
65
+ member_roles :accountant do
66
+ can :edit, :show, :if => :associated_with_client?
67
+ end
68
+ def members_role()
69
+ user.member_role( subject_or_parent.team )
70
+ end
71
+ end
72
+
73
+ # Rails 4 - definitions for strong_params
74
+ class Invoice < Default
75
+ require :invoice # requires :invoice hash. This is set by default, so in practice not necessary to define
76
+ permit :date, :due_days # permitted parameters
77
+ role :accountant do
78
+ can :edit, :show, :if => :associated_with_client?
79
+ end
80
+ role :department_manager, :accountant do
81
+ can :new, :create, :if => lambda { parent }, permit: [:date, :due_days, :discount]
82
+ end
83
+ end
62
84
  end
63
85
  ```
64
86
 
87
+ The members_role can be implemented if a user has multiple roles such as memberships of teams, projects or similar.
88
+
65
89
  The following attributes will be accessible in a Permissions class:
66
90
 
67
91
  * ```subject``` - the resource that is currently being tested for authorization
@@ -88,7 +112,7 @@ class AccountsController < ApplicationController
88
112
  end
89
113
  ```
90
114
 
91
- The trustee statement will set up 3 before_filters in your controller:
115
+ The trustee statement will set up 3 before_filters (before_actions) in your controller:
92
116
 
93
117
  ``` Ruby
94
118
  before_filter :set_user
@@ -214,6 +238,14 @@ You can even assign these if you like. The resource is also exposed as helper, s
214
238
  For simplicity we have also exposed an ```instances``` accessor that you can assign when you have a multirecord result,
215
239
  such as for index action.
216
240
 
241
+ Accessing strong_params for updates (rails 4)
242
+
243
+ ``` Ruby
244
+ @invoice.update_attributes(resource.strong_params)
245
+ # or
246
+ resource.instance.update_attributes(resource.strong_params)
247
+ ```
248
+
217
249
  ## Overriding defaults
218
250
 
219
251
  ### Overriding resource permits in the controller
@@ -22,6 +22,7 @@
22
22
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
23
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
24
 
25
+ require 'active_support/configurable'
25
26
  require 'trust/exceptions'
26
27
  require 'trust/inheritable_attribute'
27
28
  module Trust
@@ -30,6 +31,14 @@ module Trust
30
31
  autoload :Authorization, 'trust/authorization'
31
32
  autoload :ActiveModel, 'trust/active_model'
32
33
  autoload :Actor, 'trust/actor'
34
+
35
+ include ActiveSupport::Configurable
36
+
37
+ config_accessor :log_level
38
+
39
+ def self.rails_generation
40
+ @@__generation ||= Rails.version.split('.')[0].to_i
41
+ end
33
42
  end
34
43
  require 'trust/controller'
35
44
  class ActionController::Base
@@ -25,6 +25,10 @@
25
25
  module Trust
26
26
  # = Trust Authorization
27
27
  class Authorization
28
+
29
+ # raised if attempting to do resource related operations and resource is not passed on to the Authorization object
30
+ class ResourceNotLoaded < StandardError; end
31
+
28
32
  class << self
29
33
 
30
34
  # Returns true if user is authorized to perform +action+ on +object+ or +class+.
@@ -39,25 +43,13 @@ module Trust
39
43
  #
40
44
  # This method is called by the +can?+ method in Trust::Controller, and is normally
41
45
  # not necessary to call directly.
42
- def authorized?(action, object_or_class, *args)
43
- options = args.extract_options!
44
- parent = options[:parent] || options[:for] || args.first
45
- actor = options[:by] || user
46
- if object_or_class.is_a? Class
47
- klass = object_or_class
48
- object = nil
49
- else
50
- klass = object_or_class.class
51
- object = object_or_class
52
- end
53
- # Identify which class to instanciate and then check authorization
54
- auth = authorizing_class(klass)
55
- # Rails.logger.debug "Trust: Authorizing class for #{klass.name} is #{auth.name}"
56
- auth.new(actor, action.to_sym, klass, object, parent).authorized?
46
+ def authorized?(action, object_or_class_or_resource, *args)
47
+ new(action, object_or_class_or_resource, *args).authorized?
57
48
  end
58
49
 
59
50
  # Tests if user is authorized to perform +action+ on +object+ or +class+, with the
60
51
  # optional parent and raises Trust::AccessDenied exception if not permitted.
52
+ # If user is authorized, sets the params_handler for the resource.
61
53
  #
62
54
  # Options:
63
55
  #
@@ -70,15 +62,8 @@ module Trust
70
62
  # * +:message+ - The message to be passed onto the AccessDenied exception class
71
63
  #
72
64
  # This method is used by the +access_control+ method in Trust::Controller
73
- def authorize!(action, object_or_class, *args)
74
- options = args.extract_options!
75
- parent = options[:parent] || options[:for] || args.first
76
- message = options[:message]
77
- access_denied!(message, action, object_or_class, parent) unless authorized?(action, object_or_class, parent, options)
78
- end
79
-
80
- def access_denied!(message = nil, action = nil, subject = nil, parent = nil) #:nodoc:
81
- raise AccessDenied.new(message, action, subject)
65
+ def authorize!(action, object_or_class_or_resource, *args)
66
+ new(action, object_or_class_or_resource, *args).authorize!
82
67
  end
83
68
 
84
69
  # Returns the current +user+ being used in the authorization process
@@ -91,20 +76,82 @@ module Trust
91
76
  def user=(user)
92
77
  Thread.current["current_user"] = user
93
78
  end
94
-
95
- private
96
- def authorizing_class(klass) #:nodoc:
97
- auth = nil
98
- klass.ancestors.each do |k|
99
- break if k == ::ActiveRecord::Base
100
- begin
101
- auth = "::Permissions::#{k}".constantize
102
- break
103
- rescue
104
- end
79
+ end
80
+
81
+ attr_reader :authorization, :action, :resource, :klass, :object, :parent, :actor
82
+
83
+ delegate :user, to: :class
84
+
85
+ def initialize(action, resource_object_or_class, *args)
86
+ options = args.extract_options!
87
+ @action = action.to_sym
88
+ if resource_object_or_class.is_a? Trust::Controller::Resource
89
+ @resource = resource_object_or_class
90
+ @klass = resource.klass
91
+ @object = resource.instance
92
+ @actor = options[:by] || user
93
+ @parent = resource.parent
94
+ else
95
+ @parent = options[:parent] || options[:for] || args.first
96
+ @actor = options[:by] || user
97
+ if resource_object_or_class.is_a? Class
98
+ @klass = resource_object_or_class
99
+ @object = nil
100
+ else
101
+ @klass = resource_object_or_class.class
102
+ @object = resource_object_or_class
103
+ end
104
+ end
105
+ auth = authorizing_class
106
+ # Rails.logger.debug "Trust: Authorizing class for #{klass.name} is #{auth.name}"
107
+ @authorization = auth.new(@actor, @action, @klass, @object, @parent)
108
+ end
109
+
110
+ def access_denied!(message = nil, action = nil, subject = nil, parent = nil) #:nodoc:
111
+ raise AccessDenied.new(message, action, subject)
112
+ end
113
+
114
+ def authorize!
115
+ if perm = permissions
116
+ resource.params_handler = perm
117
+ else
118
+ access_denied!(nil, action, object || klass)
119
+ end
120
+ end
121
+
122
+ def authorized?
123
+ !!permissions
124
+ end
125
+
126
+ def instance_loaded(instance)
127
+ @authorization.subject = instance
128
+ end
129
+
130
+ # Preloads resource require and permit attributes, so that new objects can be initialized properly
131
+ # raises ResourceNotLoaded if Authorization object was not initialized with a resource object
132
+ def preload
133
+ raise ResourceNotLoaded unless resource
134
+ resource.params_handler = authorization.preload
135
+ end
136
+
137
+ def permissions
138
+ authorization.authorized?
139
+ end
140
+
141
+
142
+ private
143
+ def authorizing_class #:nodoc:
144
+ auth = nil
145
+ klass.ancestors.each do |k|
146
+ break if k == ::ActiveRecord::Base
147
+ begin
148
+ auth = "::Permissions::#{k}".constantize
149
+ break
150
+ rescue
105
151
  end
106
- auth || ::Permissions::Default
107
152
  end
153
+ auth || ::Permissions::Default
108
154
  end
155
+
109
156
  end
110
157
  end
@@ -98,7 +98,7 @@ module Trust
98
98
  set_user *args
99
99
  load_resource *args
100
100
  access_control *args
101
- helper_method :can?, :resource
101
+ helper_method :can?, :resource, :resource?
102
102
  end
103
103
  end
104
104
 
@@ -136,12 +136,22 @@ module Trust
136
136
  end
137
137
 
138
138
  private
139
- def _filter_setting(method, *args)
140
- options = args.extract_options!
141
- skip_before_filter method
142
- unless args.include? :off or options[method] == :off
143
- before_filter method, options
139
+ if Trust.rails_generation < 4
140
+ def _filter_setting(method, *args)
141
+ options = args.extract_options!
142
+ skip_before_filter method
143
+ unless args.include? :off or options[method] == :off
144
+ before_filter method, options
145
+ end
144
146
  end
147
+ else
148
+ def _filter_setting(method, *args)
149
+ options = args.extract_options!
150
+ skip_before_action method
151
+ unless args.include? :off or options[method] == :off
152
+ before_action method, options
153
+ end
154
+ end
145
155
  end
146
156
  end
147
157
 
@@ -183,19 +193,33 @@ module Trust
183
193
  @resource ||= Trust::Controller::Resource.new(self, self.class.properties, action_name, params, request)
184
194
  end
185
195
 
196
+ # Returns true if resource has been loaded
197
+ def resource?
198
+ !@resource.nil?
199
+ end
186
200
  # Loads the resource which basically means loading the instance and eventual parent defined through +belongs_to+
187
201
  #
188
202
  # This method is triggered as a callback on +before_filter+
189
203
  # See {Trust::Controller::Resource} for more information
190
204
  def load_resource
191
- resource.load
205
+ if resource.new_action?
206
+ authorization.preload
207
+ authorization.instance_loaded resource.load # need to set instance on authorizing object
208
+ else
209
+ resource.load
210
+ end
192
211
  end
193
212
 
194
213
  # Performs the actual access_control.
195
214
  #
196
215
  # This method is triggered as a callback on +before_filter+
197
216
  def access_control
198
- Trust::Authorization.authorize!(action_name, resource.instance || resource.klass, resource.parent)
217
+ authorization.authorize!
218
+ end
219
+
220
+ # maintains access to the authorization object
221
+ def authorization
222
+ @authorization ||= Trust::Authorization.new(action_name, resource)
199
223
  end
200
224
 
201
225
  # Tests for current users permissions.
@@ -83,6 +83,18 @@ module Trust
83
83
  model.to_s.classify.constantize
84
84
  end
85
85
 
86
+ # => true if action is a new_action
87
+ def new_action?(action)
88
+ new_actions.include? action.to_sym
89
+ end
90
+ # => true if action is a collection_action
91
+ def collection_action?(action)
92
+ collection_actions.include? action.to_sym
93
+ end
94
+ # => true if action is a member_action
95
+ def member_action?(action)
96
+ member_actions.include? action.to_sym
97
+ end
86
98
  # Specify associated resources (nested resources)
87
99
  #
88
100
  # === Example
@@ -44,14 +44,16 @@ module Trust
44
44
  delegate :logger, :to => Rails
45
45
  attr_reader :properties, :params, :action
46
46
  attr_reader :info, :parent_info, :relation
47
+ attr_reader :params_handler
47
48
 
48
49
  def initialize(controller, properties, action_name, params, request) # nodoc
49
50
  @action = action_name.to_sym
50
-
51
+ @params_handler = {}
51
52
  @controller, @properties, @params = controller, properties, params
52
53
  @info = extract_resource_info(properties.model, params)
53
54
  if properties.has_associations?
54
55
  @parent_info = extract_parent_info(properties.associations, params, request)
56
+ self.parent = parent_info.object if parent_info
55
57
  end
56
58
  @relation = @info.relation(@parent_info)
57
59
  end
@@ -73,7 +75,7 @@ module Trust
73
75
  @controller.instance_variable_set(:"@#{instance_name}", instance)
74
76
  end
75
77
 
76
- # Returns the parameters for the instance
78
+ # Returns the parameters for the instance (Rails 3)
77
79
  #
78
80
  # ==== Example
79
81
  #
@@ -82,15 +84,53 @@ module Trust
82
84
  def instance_params
83
85
  info.params
84
86
  end
87
+
88
+ # Returns strong parameters for the instance (Rails 4)
89
+ # This call will take advantage of the spesified in permissions.
90
+ # If no such permissions is defined, it will fall back to instance_params
91
+ #
92
+ # ==== Example
93
+ #
94
+ # # assume the following permissions defined
95
+ # class Account < Default
96
+ # require :account
97
+ # permit :number, :amount
98
+ # end
99
+ #
100
+ # # in AccountsController
101
+ # resource.strong_params # same as params.require(:account).permit(:number, :amount)
102
+ #
103
+ # # as a new action
104
+ # resource.strong_params(true) # same as params.fetch(:account, {}).permit(:number, :amount)
105
+ #
106
+ def strong_params(new_action = new_action?)
107
+ if params_handler.size > 0
108
+ if params_handler[:require]
109
+ new_action ?
110
+ params.fetch(params_handler[:require], {}).permit(params_handler[:permit]) :
111
+ params.require(params_handler[:require]).permit(params_handler[:permit])
112
+ else
113
+ params.permit(params_handler[:permit])
114
+ end
115
+ else
116
+ instance_params
117
+ end
118
+ end
119
+
120
+ if Trust.rails_generation < 4
121
+ def strong_params(new_action = new_action?)
122
+ instance_params
123
+ end
124
+ end
85
125
 
86
126
  # Returns the parents instance variable when you use +belongs_to+ for nested routes
87
127
  def parent
88
- @controller.instance_variable_get(:"@#{parent_name}")
128
+ parent_name && @controller.instance_variable_get(:"@#{parent_name}")
89
129
  end
90
130
 
91
131
  # Sets the parent instance variable
92
132
  def parent=(instance)
93
- @controller.instance_variable_set(:"@#{parent_name}", instance)
133
+ @controller.instance_variable_set(:"@#{parent_name}", instance) if parent_name
94
134
  end
95
135
 
96
136
  # Returns the cinstance variable for ollection
@@ -124,6 +164,25 @@ module Trust
124
164
  @info.collection(@parent_info, instance)
125
165
  end
126
166
 
167
+ # true if action is a collection action
168
+ def collection_action?
169
+ @collection_action ||= properties.collection_action?(action)
170
+ end
171
+
172
+ # true if action is a collection action
173
+ def member_action?
174
+ @member_action ||= properties.member_action?(action)
175
+ end
176
+
177
+ # Returns a nested resource if parent is set
178
+ def nested
179
+ parent ? [parent, instance] : [instance]
180
+ end
181
+
182
+ # true if action is a new action
183
+ def new_action?
184
+ @new_action ||= properties.new_action?(action)
185
+ end
127
186
 
128
187
  # Loads the resource
129
188
  #
@@ -133,11 +192,10 @@ module Trust
133
192
  # If using nested resources and +belongs_to+ has been declared in the controller it will use the
134
193
  # parent relation if found.
135
194
  def load
136
- self.parent = parent_info.object if parent_info
137
- if properties.new_actions.include?(action)
138
- # logger.debug "Trust.load: Setting new: class: #{klass} info.params: #{info.params.inspect}"
139
- self.instance ||= relation.new(info.params)
140
- @controller.send(:build, action) if @controller.respond_to?(:build,true)
195
+ if new_action?
196
+ # logger.debug "Trust.load: Setting new: class: #{klass} strong_params: #{strong_params.inspect}"
197
+ self.instance ||= relation.new(strong_params)
198
+ @controller.send(:build, action) if @controller.respond_to?(:build, true)
141
199
  elsif properties.member_actions.include?(action)
142
200
  # logger.debug "Trust.load: Finding parent: #{parent.inspect}, relation: #{relation.inspect}"
143
201
  self.instance ||= relation.find(params[:id] || params["#{relation.name.underscore}_id".to_sym])
@@ -157,6 +215,16 @@ module Trust
157
215
  info.name
158
216
  end
159
217
 
218
+ # Assigns the handler for safe parameters
219
+ #
220
+ # This is normally set by the controller during authorization
221
+ # If you want to set this your self it should
222
+ def params_handler=(handler)
223
+ @params_handler = handler
224
+ end
225
+
226
+
227
+
160
228
  # Returns the plural name of the instance for the resource
161
229
  #
162
230
  # ==== Example
@@ -322,11 +390,11 @@ module Trust
322
390
  @as = as
323
391
  ([@klass] + @klass.descendants).detect do |c|
324
392
  @name = c.to_s.underscore.tr('/','_').to_sym
325
- unless @id = request.symbolized_path_parameters["#{@name}_id".to_sym]
393
+ unless @id = request.path_parameters["#{@name}_id".to_sym]
326
394
  # see if name space handling is necessary
327
395
  if c.to_s.include?('::')
328
396
  @name = c.to_s.demodulize.underscore.to_sym
329
- @id = request.symbolized_path_parameters["#{@name}_id".to_sym]
397
+ @id = request.path_parameters["#{@name}_id".to_sym]
330
398
  end
331
399
  end
332
400
  @id