multiparameter_attributes_handler 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -18,27 +18,50 @@ when set to 24th June 2004, will generate
18
18
  }
19
19
 
20
20
  ActiveRecord understands this and converts these key/value pairs into a date
21
- object that is passed to thing.last_record=
21
+ object that is passed to thing.last_read=
22
22
 
23
23
  === A solution without ActiveRecord
24
24
 
25
- Multiparameter Attributes Handler allows other objects to do the same. In
26
- particular, ActiveResource models.
25
+ Multiparameter Attributes Handler allows other objects to do the same.
27
26
 
28
- It does this by modifying the way attributes= works. So for the above example,
29
- the values passed down the attributes= chain gets converted to:
27
+ thing_params = MultiparameterAttributesHandler.manipulate_all(params[:thing])
30
28
 
31
- 'thing' => {
29
+ This creates a last_read key with a time object derived from the values
30
+
31
+ thing_params == {
32
32
  "last_read(1i)" => "2004",
33
33
  "last_read(2i)" => "6",
34
34
  "last_read(3i)" => "24",
35
35
  "last_read" => Time.local('2004', '6', '24')
36
- }
36
+ }
37
37
 
38
- So for a ActiveResource Thing, this functionality is added like this:
38
+ So for a ActiveResource Thing, this functionality can be added by over-riding
39
+ the attributes setter:
39
40
 
40
41
  class Thing < ActiveResource::Base
41
- include MultiparameterAttributesHandler
42
+ def attributes=(params)
43
+ super MultiparameterAttributesHandler.manipulate_all(params)
44
+ end
45
+ end
46
+
47
+ However, as the params splitting and rebuilding is happening in the views and
48
+ controller space, it might well make more sense to do the manipulation in the
49
+ controller:
50
+
51
+ class ThingsController < ApplicationController
52
+
53
+ ....
54
+
55
+ def update
56
+ @thing = Thing.find(params[:id])
57
+ @property.update_attributes thing_params
58
+ redirect_to @property
59
+ end
60
+
61
+ private
62
+ def thing_params
63
+ MultiparameterAttributesHandler.manipulate_all(params[:thing])
64
+ end
42
65
  end
43
66
 
44
67
  === Only setter affected
@@ -47,34 +70,20 @@ Note that this gem provides handling of the parameters received from the form
47
70
  submission. For the form helpers to work, they need to passed a date or time
48
71
  to the form.
49
72
 
50
- One solution is to over-ride the getter in the model. So for the Thing example
51
- above, the complete solution would look like this:
73
+ One solution is to override the getter in the model. So for the Thing example
74
+ above:
52
75
 
53
76
  require 'date'
54
77
  class Thing < ActiveResource::Base
55
- include MultiparameterAttributesHandler
56
78
 
57
79
  def last_read
58
- Date.parse(super)
80
+ Time.parse(super)
59
81
  end
60
82
  end
61
83
 
62
84
  Rails form date helpers will then work for last_read:
63
85
 
64
- date_select(:thing, :last_read)
65
-
66
- And in the controller's create and update methods:
67
-
68
- thing.attributes = params[:thing]
69
-
70
- Or
71
-
72
- Thing.new(params[:thing])
73
-
74
- Or
75
-
76
- thing.update_attributes(params[:thing])
77
-
86
+ datetime_select(:thing, :last_read)
78
87
 
79
88
  === Installation
80
89
 
@@ -2,8 +2,8 @@ require_relative 'multiparameter_attributes_handler/manipulator'
2
2
  require_relative 'multiparameter_attributes_handler/multiparameter_attributes_handler_error'
3
3
  module MultiparameterAttributesHandler
4
4
 
5
- def attributes=(new_attributes)
6
- super Manipulator.new(new_attributes).output
5
+ def self.manipulate_all(hash)
6
+ Manipulator.new(hash).output
7
7
  end
8
8
 
9
9
  end
@@ -1,10 +1,27 @@
1
1
  module MultiparameterAttributesHandler
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # 0.0.2: Modified usage so that developer decides where manipulation happens
9
+ # ---------------------------------------------------------------------------
10
+ #
11
+ # Previously, it was assumed that the functionality would be applied to a model's
12
+ # attributes= method, as this is where most params values are sent (eventually).
13
+ #
14
+ # After some experimentation and consideration, it was realised that this is
15
+ # too restrictive. It also became apparent that the manipulation may need to
16
+ # happen in the controller rather than the model. Especially in Rails 4 where
17
+ # strong_parameters will already be manipulating the params.
18
+ #
19
+ # Therefore, the functionality was repackaged so it could be used anywhere.
20
+ #
21
+ # This change in usage will also make it easier to create single method usage
22
+ # in the future: where rather than manipulating all multiparameter attributes,
23
+ # it will be possible to specify which attributes to manipulate.
24
+ #
8
25
  # 0.0.1: First gem
9
26
  # ----------------
10
27
  #
data/test/thing.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  require_relative '../lib/multiparameter_attributes_handler'
2
2
 
3
- class Parent
4
- attr_accessor :attributes
5
- end
6
-
7
-
8
- class Thing < Parent
3
+ class Thing
4
+
5
+ attr_reader :attributes
9
6
 
10
- include MultiparameterAttributesHandler
11
7
 
12
8
  def initialize
13
9
 
14
10
  end
11
+
12
+ def attributes=(params)
13
+ @attributes = MultiparameterAttributesHandler.manipulate_all(params)
14
+ end
15
15
  end
16
16
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multiparameter_attributes_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: