setting_accessors 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.editorconfig +10 -0
- data/.rspec +1 -0
- data/.rubocop.yml +131 -0
- data/.travis.yml +11 -7
- data/Appraisals +17 -0
- data/CHANGELOG.md +38 -1
- data/Gemfile +2 -0
- data/README.md +64 -124
- data/Rakefile +5 -27
- data/bin/console +15 -0
- data/bin/setup +10 -0
- data/gemfiles/rails_4.1.gemfile +7 -0
- data/gemfiles/rails_4.2.gemfile +7 -0
- data/gemfiles/rails_4.2.gemfile.lock +162 -0
- data/gemfiles/rails_5.0.gemfile +7 -0
- data/gemfiles/rails_5.0.gemfile.lock +169 -0
- data/gemfiles/rails_5.1.gemfile +7 -0
- data/gemfiles/rails_5.1.gemfile.lock +169 -0
- data/gemfiles/rails_5.2.gemfile +7 -0
- data/gemfiles/rails_5.2.gemfile.lock +177 -0
- data/lib/generators/setting_accessors/install_generator.rb +11 -9
- data/lib/generators/setting_accessors/templates/model.rb.erb +0 -24
- data/lib/setting_accessors.rb +14 -5
- data/lib/setting_accessors/accessor_generator.rb +66 -0
- data/lib/setting_accessors/converters/base.rb +24 -0
- data/lib/setting_accessors/converters/boolean_converter.rb +51 -0
- data/lib/setting_accessors/converters/integer_converter.rb +21 -0
- data/lib/setting_accessors/converters/polymorphic_converter.rb +11 -0
- data/lib/setting_accessors/converters/string_converter.rb +11 -0
- data/lib/setting_accessors/helpers.rb +28 -0
- data/lib/setting_accessors/integration.rb +83 -97
- data/lib/setting_accessors/internal.rb +37 -64
- data/lib/setting_accessors/setting_scaffold.rb +147 -214
- data/lib/setting_accessors/setting_set.rb +168 -0
- data/lib/setting_accessors/version.rb +3 -1
- data/lib/tasks/setting_accessors_tasks.rake +2 -0
- data/setting_accessors.gemspec +27 -19
- metadata +117 -143
- data/.codeclimate.yml +0 -66
- data/lib/setting_accessors/accessor.rb +0 -189
- data/lib/setting_accessors/converter.rb +0 -71
- data/lib/setting_accessors/integration_validator.rb +0 -15
- data/lib/setting_accessors/validator.rb +0 -144
- data/test/dummy/README.rdoc +0 -28
- data/test/dummy/Rakefile +0 -6
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/test/dummy/app/controllers/application_controller.rb +0 -5
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/models/post.rb +0 -2
- data/test/dummy/app/models/setting.rb +0 -59
- data/test/dummy/app/models/user.rb +0 -19
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/bin/bundle +0 -3
- data/test/dummy/bin/rails +0 -4
- data/test/dummy/bin/rake +0 -4
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -25
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/database.yml +0 -25
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -37
- data/test/dummy/config/environments/production.rb +0 -83
- data/test/dummy/config/environments/test.rb +0 -34
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -4
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/initializers/setting_accessors.rb +0 -1
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -23
- data/test/dummy/config/routes.rb +0 -56
- data/test/dummy/config/secrets.yml +0 -22
- data/test/dummy/config/settings.yml +0 -23
- data/test/dummy/db/migrate/20150102112106_create_users.rb +0 -9
- data/test/dummy/db/migrate/20150102115329_create_settings.rb +0 -12
- data/test/dummy/db/migrate/20150723114600_create_posts.rb +0 -11
- data/test/dummy/db/schema.rb +0 -40
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/public/404.html +0 -67
- data/test/dummy/public/422.html +0 -67
- data/test/dummy/public/500.html +0 -66
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/posts.yml +0 -11
- data/test/dummy/test/models/post_test.rb +0 -19
- data/test/dummy/test/models/setting_test.rb +0 -143
- data/test/dummy/test/models/user_test.rb +0 -154
- data/test/generators/install_generator_test.rb +0 -15
- data/test/setting_accessors_test.rb +0 -4
- data/test/test_helper.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ccf27bd36edbc82a68d4f3030c58e3582f71c63dafd2289c5fb483bfd8a81263
|
4
|
+
data.tar.gz: 153d794f0323bb0f8518a8331145766df1ca8fc935c88a4419f9b5772c2226db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff2f5b55fb799e97f14272962f832de8121ee549aa53a7c988a205e7028b4d9b9ad1f5cd5f141a5ce8c8d5d29b494b7ffff2e1ead3929dae4e5df3406f64d285
|
7
|
+
data.tar.gz: 1c7819afb12ef5cfd4de81ca05e6c3c5605eb1c9e2173a977bcd806b64b229443733e13b1c31b18dc3579a1fc17ca1b4677ee6f7d7c47bc701caa2a61e1b32e0
|
data/.editorconfig
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.3
|
3
|
+
Exclude:
|
4
|
+
- tmp/**/*
|
5
|
+
- gemfiles/**/*
|
6
|
+
|
7
|
+
#---------------------------------------------
|
8
|
+
# Layout
|
9
|
+
#---------------------------------------------
|
10
|
+
|
11
|
+
# Hashes do not need padding
|
12
|
+
Layout/SpaceInsideHashLiteralBraces:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
# Allow 2 space indentation for when inside a case
|
16
|
+
Layout/CaseIndentation:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
# Allow empty lines in classes
|
20
|
+
Layout/EmptyLinesAroundClassBody:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
# Allow multiple spaces before first argument
|
24
|
+
Layout/SpaceBeforeFirstArg:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
# Allow extra spacing, e.g. to align components
|
28
|
+
Layout/ExtraSpacing:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
# Usually good, but in some cases not possible
|
32
|
+
Layout/AlignHash:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
# Allow an empty line after do / before end
|
36
|
+
Layout/EmptyLinesAroundBlockBody:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
# Again, generally a good idea, but it has problems with multiline operations in
|
40
|
+
# combination with assignments
|
41
|
+
Layout/MultilineOperationIndentation:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
# See the corresponding other cops
|
45
|
+
Layout/EmptyLinesAroundModuleBody:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
Layout/SpaceInLambdaLiteral:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
#---------------------------------------------
|
52
|
+
# Metrics
|
53
|
+
#---------------------------------------------
|
54
|
+
|
55
|
+
# Allow bigger classes
|
56
|
+
Metrics/ClassLength:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Metrics/LineLength:
|
60
|
+
Max: 120
|
61
|
+
|
62
|
+
# To make it possible to copy or click on URIs in the code, we allow lines
|
63
|
+
# containing a URI to be longer than Max.
|
64
|
+
AllowHeredoc: true
|
65
|
+
AllowURI: true
|
66
|
+
|
67
|
+
Metrics/BlockLength:
|
68
|
+
Max: 75
|
69
|
+
Exclude:
|
70
|
+
- spec/**/*.rb
|
71
|
+
|
72
|
+
# Allow longer methods
|
73
|
+
Metrics/MethodLength:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
# Allow bigger modules
|
77
|
+
Metrics/ModuleLength:
|
78
|
+
Enabled: false
|
79
|
+
|
80
|
+
#---------------------------------------------
|
81
|
+
# Naming
|
82
|
+
#---------------------------------------------
|
83
|
+
|
84
|
+
Naming/HeredocDelimiterNaming:
|
85
|
+
Enabled: false
|
86
|
+
|
87
|
+
#---------------------------------------------
|
88
|
+
# Style
|
89
|
+
#---------------------------------------------
|
90
|
+
|
91
|
+
# Allow fail() for initial exception, raise() for re-raise
|
92
|
+
# It seems that the cop decision was mainly based on "more people use raise than fail"...
|
93
|
+
Style/SignalException:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
# Allow assigning multiple variables in one line.
|
97
|
+
# This should not be overused, but comes in handy when assigning initializer values to instance variables
|
98
|
+
Style/ParallelAssignment:
|
99
|
+
Enabled: false
|
100
|
+
|
101
|
+
# Depending on the situation, it might make more sense to use
|
102
|
+
# [:symbol1, :symbol2] over %i[symbol1 symbol2], e.g. for multiline aligning reasons.
|
103
|
+
Style/SymbolArray:
|
104
|
+
Enabled: false
|
105
|
+
|
106
|
+
# Not all modules have to have top level comments
|
107
|
+
Style/Documentation:
|
108
|
+
Enabled: false
|
109
|
+
|
110
|
+
# Allow class variable usage
|
111
|
+
Style/ClassVars:
|
112
|
+
Enabled: false
|
113
|
+
|
114
|
+
# Allow block comments
|
115
|
+
Style/BlockComments:
|
116
|
+
Enabled: false
|
117
|
+
|
118
|
+
# Allow the use of !! (conversion of nil/object to true/false)
|
119
|
+
Style/DoubleNegation:
|
120
|
+
Enabled: false
|
121
|
+
|
122
|
+
# Allow unless/if blocks even for one-liners
|
123
|
+
Style/IfUnlessModifier:
|
124
|
+
Enabled: false
|
125
|
+
|
126
|
+
Style/GuardClause:
|
127
|
+
Enabled: false
|
128
|
+
|
129
|
+
Style/MissingRespondToMissing:
|
130
|
+
Exclude:
|
131
|
+
- lib/setting_accessors/setting_scaffold.rb
|
data/.travis.yml
CHANGED
@@ -2,19 +2,23 @@ language: ruby
|
|
2
2
|
cache: bundler
|
3
3
|
|
4
4
|
rvm:
|
5
|
-
- 2.
|
6
|
-
- 2.3.
|
5
|
+
- 2.3.0
|
6
|
+
- 2.3.3
|
7
|
+
- 2.4.0
|
8
|
+
- 2.4.4
|
9
|
+
- 2.5.0
|
10
|
+
- 2.5.3
|
7
11
|
|
8
|
-
|
9
|
-
-
|
12
|
+
gemfile:
|
13
|
+
- gemfiles/rails_4.2.gemfile
|
14
|
+
- gemfiles/rails_5.0.gemfile
|
15
|
+
- gemfiles/rails_5.1.gemfile
|
16
|
+
- gemfiles/rails_5.2.gemfile
|
10
17
|
|
11
18
|
before_install: 'gem install bundler'
|
12
19
|
script: 'bundle exec rake'
|
13
20
|
|
14
21
|
notifications:
|
15
22
|
email:
|
16
|
-
recipients:
|
17
|
-
- stex@sterex.de
|
18
23
|
on_failure: change
|
19
24
|
on_success: never
|
20
|
-
|
data/Appraisals
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
appraise 'rails-4.2' do
|
4
|
+
gem 'rails', '~> 4.2.0'
|
5
|
+
end
|
6
|
+
|
7
|
+
appraise 'rails-5.0' do
|
8
|
+
gem 'rails', '~> 5.0.0'
|
9
|
+
end
|
10
|
+
|
11
|
+
appraise 'rails-5.1' do
|
12
|
+
gem 'rails', '~> 5.1.0'
|
13
|
+
end
|
14
|
+
|
15
|
+
appraise 'rails-5.2' do
|
16
|
+
gem 'rails', '~> 5.2.0'
|
17
|
+
end
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,42 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.0.0
|
4
|
+
|
5
|
+
This is almost a complete refactoring of the gem which also removes some not really needed functionality.
|
6
|
+
It is the first release fully compatible with Rails 5.
|
7
|
+
|
8
|
+
New minimum versions:
|
9
|
+
|
10
|
+
* Ruby: 2.3
|
11
|
+
* Rails: 4.2
|
12
|
+
|
13
|
+
#### General
|
14
|
+
|
15
|
+
* Removed globally defined settings (`config/settings.yml`) and therefore also global validations and type conversions.
|
16
|
+
It is still possible to create global Settings, but each developer has to make sure that the assigned
|
17
|
+
value is valid and correctly typed.
|
18
|
+
* Type conversion follows AR's type conversions more strictly now.
|
19
|
+
This means that e.g. assigning `1.0` to a boolean setting will result in `true` instead of `nil` as before.
|
20
|
+
* Updating an attribute created through `setting_accessor` now leads to the record being touched,
|
21
|
+
similar to what would happen when a normal database attribute was changed. (#4)
|
22
|
+
* Setting a new value for an attribute created through `attribute_accessor` will now mark
|
23
|
+
the record as "dirty", meaning `changed?` returns true. (#9)
|
24
|
+
This was especially needed for Rails 5 as it only even performs a database operation in this case.
|
25
|
+
|
26
|
+
#### Tests
|
27
|
+
|
28
|
+
* Tests are now written in RSpec
|
29
|
+
* The dummy Rails application has been removed and replaced with `with_model`
|
30
|
+
* Appraisal was added to test against multiple Rails versions
|
31
|
+
|
32
|
+
#### API Changes
|
33
|
+
|
34
|
+
* `method_missing` is now part of the SettingScaffold and therefore no longer needed in the actual Setting model.
|
35
|
+
You should remove `method_missing` from your model.
|
36
|
+
* Setting.create_or_update was renamed to Setting.set and now uses a keyword argument for `assignable`
|
37
|
+
* `setting_accessor` no longer supports the `fallback` option.
|
38
|
+
If a `default` option is given, it is automatically used as fallback.
|
39
|
+
|
3
40
|
## 0.3.0
|
4
41
|
|
5
|
-
* Fixed a bug that caused setting accessors not being initialized when being called as part of a rake task chain (#6)
|
42
|
+
* Fixed a bug that caused setting accessors not being initialized when being called as part of a rake task chain (#6)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,7 @@ SettingAccessors
|
|
3
3
|
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/setting_accessors.svg)](http://badge.fury.io/rb/setting_accessors)
|
5
5
|
[![Build Status](https://travis-ci.org/Stex/setting_accessors.svg?branch=master)](https://travis-ci.org/Stex/setting_accessors)
|
6
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/78becd1d005aab2d1409/maintainability)](https://codeclimate.com/github/Stex/setting_accessors/maintainability)
|
6
7
|
|
7
8
|
Sometimes it's handy to keep track of various settings or attributes in ActiveRecord instances and persist them through various requests (and sessions). An example would be to store a items-per-page value for multiple tables in the application per user or probably also set default sorting directions.
|
8
9
|
|
@@ -11,6 +12,20 @@ The only problem is, that it would be necessary to either keep hundreds of colum
|
|
11
12
|
This gem consists of a global key-value-store, allowing to use both global and record bound settings
|
12
13
|
and ActiveRecord integration to add virtual columns to models without having to change the database layout.
|
13
14
|
|
15
|
+
Version Information / Backwards Compatibility
|
16
|
+
---------------------------------------------
|
17
|
+
|
18
|
+
The current version (1.x) is only compatible with Ruby >= 2.3 and Rails >= 4.2.
|
19
|
+
Versions 0.x support older versions of both Ruby and Rails.
|
20
|
+
|
21
|
+
Version 0.x also supported validations and type conversions for globally defined settings
|
22
|
+
(`Setting.my_setting = 5`).
|
23
|
+
This was removed in this version, so developers should make sure that the assigned
|
24
|
+
value has the correct type themselves.
|
25
|
+
|
26
|
+
Validations for class-wise defined `setting_accessor`s can still be realized using
|
27
|
+
ActiveModel's integrated validators as described below.
|
28
|
+
|
14
29
|
Installation
|
15
30
|
------------
|
16
31
|
|
@@ -37,7 +52,6 @@ The gem requires a few additional files to work properly:
|
|
37
52
|
- A migration to create the settings table
|
38
53
|
- A setting model
|
39
54
|
- An initializer
|
40
|
-
- A settings config file (config/settings.yml)
|
41
55
|
|
42
56
|
All of them can be generated using the provided generator:
|
43
57
|
|
@@ -47,12 +61,15 @@ $ rails g setting_accessors:install MODEL_NAME
|
|
47
61
|
|
48
62
|
If no model name is given, the default one (`Setting`) is used.
|
49
63
|
|
50
|
-
Usage as a global key-value-store
|
64
|
+
Usage as a global key-value-store
|
51
65
|
-----
|
52
66
|
|
53
|
-
In the following, the model name will be assumed as `Setting`,
|
67
|
+
In the following, the model name will be assumed as `Setting`,
|
68
|
+
though you may choose its name freely using the provided generator (see above).
|
54
69
|
|
55
|
-
Settings can either be global or assigned to an instance of ActiveRecord::Base.
|
70
|
+
Settings can either be global or assigned to an instance of ActiveRecord::Base.
|
71
|
+
They consist of a name which is unique either in the global scope or within the instance
|
72
|
+
and a value which can be everything that's serializable through YAML.
|
56
73
|
|
57
74
|
The easiest way to use the settings model is as a global key-value-store without validations and typecasting.
|
58
75
|
|
@@ -64,7 +81,9 @@ Setting.the_meaning_of_life
|
|
64
81
|
#=> 42
|
65
82
|
```
|
66
83
|
|
67
|
-
If the name contains characters which are not allowed due to ruby naming rules,
|
84
|
+
If the name contains characters which are not allowed due to ruby naming rules,
|
85
|
+
you can also use the methods`Setting[KEY]` resp. `Setting.get(KEY)` to get a setting's value
|
86
|
+
and `Setting[KEY] = VALUE` resp.`Setting.set(KEY, VALUE)`.
|
68
87
|
|
69
88
|
Therefore, the following getter methods are equivalent:
|
70
89
|
|
@@ -79,54 +98,23 @@ For the corresponding setters:
|
|
79
98
|
```ruby
|
80
99
|
Setting.meaning_of_life = 42
|
81
100
|
Setting[:meaning_of_life] = 42
|
82
|
-
Setting.
|
101
|
+
Setting.set(:meaning_of_life, 42)
|
83
102
|
```
|
84
103
|
|
85
|
-
|
86
|
-
|
87
|
-
As stated above, the initializer will generate a file called `settings.yml` in your application's `config` directory. This file is used to define global settings, an entry consists of:
|
88
|
-
|
89
|
-
- The setting's name
|
90
|
-
- The setting's type (optional)
|
91
|
-
- Validations to be performed when the setting is saved (optional)
|
92
|
-
- A default value (optional)
|
93
|
-
|
94
|
-
An example would be a simple string setting:
|
95
|
-
|
96
|
-
```yaml
|
97
|
-
a_string:
|
98
|
-
type: string
|
99
|
-
default: "I am a string!"
|
100
|
-
validations:
|
101
|
-
presence: true
|
102
|
-
```
|
103
|
-
|
104
|
-
If a setting is defined with a type, automatic type conversion will happen, similar to what ActiveRecord does:
|
104
|
+
This makes it also possible to use Ruby's or-equals operator:
|
105
105
|
|
106
106
|
```ruby
|
107
|
-
Setting.
|
108
|
-
|
109
|
-
```
|
110
|
-
|
111
|
-
The default value is used by the functions `Setting.get_or_default` and `Setting.create_default_setting` and a fallback option for assigned settings (see below).
|
112
|
-
|
113
|
-
The built-in validations currently support, this might be extended in the future.
|
114
|
-
|
115
|
-
| Base Validation | Options |
|
116
|
-
|:----------------|:---------------------------|
|
117
|
-
| `presence` | `allow_nil`, `allow_blank` |
|
118
|
-
| `numericality` | `only_integer` |
|
119
|
-
| `boolean` | |
|
120
|
-
|
107
|
+
Setting.meaning_of_life ||= 42
|
108
|
+
Setting[:meaning_of_life] ||= 42
|
109
|
+
```
|
121
110
|
|
122
111
|
### Assigned Records
|
123
112
|
|
124
|
-
|
125
|
-
|
113
|
+
Global settings can also be assigned to an instance of `ActiveRecord::Base` without
|
114
|
+
having to define them in the model first.
|
126
115
|
|
127
|
-
An example would be
|
128
|
-
|
129
|
-
rows/items each user would like to display.
|
116
|
+
An example would be to save "items per page" values for various views:
|
117
|
+
Let's say we have an events view and want to save how many rows/items each user would like to display.
|
130
118
|
|
131
119
|
As there might be many views requiring this functionality, it wouldn't make
|
132
120
|
sense to define global settings for each of them. Instead, we would use anonymous
|
@@ -138,122 +126,74 @@ def items_per_page
|
|
138
126
|
default_value = 30
|
139
127
|
Setting.get(key, current_user) || default_value
|
140
128
|
end
|
141
|
-
```
|
142
|
-
|
143
|
-
ActiveRecord Integration
|
144
|
-
------------------------
|
145
|
-
|
146
|
-
The gem adds the method `setting_accessor` to each class which inherits from `ActiveRecord::Base`.
|
147
|
-
|
148
|
-
`setting_accessor` takes a setting name and a set of options to customize the accessor's behaviour:
|
149
129
|
|
150
|
-
|
151
|
-
|
152
|
-
|
130
|
+
def set_items_per_page
|
131
|
+
key = [controller_path, action_name].join('_')
|
132
|
+
Setting.set(key, params[:per_page], assignable: current_user) || default_value
|
153
133
|
end
|
154
134
|
```
|
155
135
|
|
156
|
-
|
136
|
+
The following calls are equivalent:
|
157
137
|
|
158
138
|
```ruby
|
159
|
-
|
160
|
-
|
161
|
-
#Setter
|
162
|
-
my_model.a_string = 1234
|
163
|
-
|
164
|
-
#Getter
|
165
|
-
my_model.a_string
|
166
|
-
#=> "1234"
|
167
|
-
|
168
|
-
#Value before type cast
|
169
|
-
my_model.a_string_before_type_cast
|
170
|
-
#=> 1234
|
171
|
-
|
172
|
-
#Old value
|
173
|
-
my_model.a_string_was
|
174
|
-
#=> "I am a string!" (fallback value, see below)
|
175
|
-
|
176
|
-
#Check if the value was changed
|
177
|
-
my_model.a_string_changed?
|
178
|
-
#=> true
|
139
|
+
Setting[:meaning_of_life, current_universe] = 42
|
140
|
+
Setting.set(:meaning_of_life, 42, assignable: current_universe)
|
179
141
|
```
|
180
142
|
|
181
|
-
|
182
|
-
|
183
|
-
### Integration of globally defined settings
|
143
|
+
`[]=` is not an exact alias of `set` here to still support `or-else`:
|
184
144
|
|
185
|
-
|
145
|
+
```ruby
|
146
|
+
Setting[:meaning_of_life, current_universe] ||= 42
|
147
|
+
```
|
186
148
|
|
187
|
-
|
149
|
+
ActiveRecord Integration
|
150
|
+
------------------------
|
188
151
|
|
189
|
-
|
152
|
+
The gem adds the method `setting_accessor` to each class which inherits from `ActiveRecord::Base`.
|
190
153
|
|
191
|
-
|
154
|
+
It basically generates an `attribute_accessor` with the given name, but also makes sure that
|
155
|
+
the value is persisted when the actual record is saved. It also provides the standard attribute helper
|
156
|
+
methods ActiveRecord adds for each database column (`ATTRIBUTE_changed?`, `ATTRIBUTE_was`, ...).
|
192
157
|
|
193
|
-
|
158
|
+
It aims to simulate an actual database column.
|
194
159
|
|
195
160
|
```ruby
|
196
161
|
class MyModel < ActiveRecord::Base
|
197
|
-
setting_accessor :my_setting, :
|
162
|
+
setting_accessor :my_setting, type: :boolean, default: false
|
198
163
|
end
|
199
164
|
```
|
200
165
|
|
201
166
|
### Options
|
202
167
|
|
203
168
|
```ruby
|
204
|
-
:
|
169
|
+
type: :string | :integer | :boolean | :polymorphic
|
205
170
|
```
|
206
171
|
|
207
|
-
`:type` defines the setting's data type. If no type is given, `:polymorhpic`
|
208
|
-
is used automatically.
|
172
|
+
`:type` defines the setting's data type. If no type is given, `:polymorhpic` is used automatically.
|
209
173
|
|
210
174
|
For every other type, the setting's value is automatically converted accordingly
|
211
|
-
upon setting it, mimicking ActiveRecord's
|
175
|
+
upon setting it, mimicking ActiveRecord's type casting based on database types.
|
212
176
|
Please note that `:polymorphic` values are saved as is, meaning that you can
|
213
177
|
store everything that's serializable.
|
214
178
|
|
215
|
-
More types will be added in the future, most likely all database types
|
216
|
-
ActiveRecord can handle as well.
|
217
|
-
|
218
179
|
```ruby
|
219
|
-
:
|
180
|
+
default: Object
|
220
181
|
```
|
221
182
|
|
222
|
-
`:default` sets the setting's default value
|
223
|
-
|
224
|
-
|
225
|
-
```ruby
|
226
|
-
:fallback => :global | :default | Object
|
227
|
-
```
|
183
|
+
`:default` sets the setting's default value that is returned as long no actual setting exists for
|
184
|
+
that name/assignable.
|
228
185
|
|
229
|
-
|
230
|
-
setting did not receive a value yet:
|
231
|
-
|
232
|
-
- `:global` will try to retrieve a global setting (`Setting.NAME`) with the same
|
233
|
-
name as the accessor and return `nil` if it isn't defined.
|
234
|
-
- `:default` will return the default value set up either in the accessor method
|
235
|
-
or `config/settings.yml` for globally defined settings.
|
236
|
-
- Every other value will be returned as is
|
237
|
-
|
238
|
-
|
239
|
-
```ruby
|
240
|
-
:validations => {:presence => true}
|
241
|
-
:validations => {:numericality => {:only_integer => true}}
|
242
|
-
:validations => {:custom => [lambda {|setting| setting.errors.add(:not_42) if setting.value != 42}]}
|
243
|
-
:validations => {:custom => [:must_be_42]}
|
244
|
-
```
|
186
|
+
### Validations
|
245
187
|
|
246
|
-
|
247
|
-
|
248
|
-
For model specific settings, you may treat the setting accessors just like normal columns
|
249
|
-
and define your validations accordingly, e.g.
|
188
|
+
Attributes created by `setting_accessor` can simply be used with `ActiveModel::Validations` the same way
|
189
|
+
as other attributes:
|
250
190
|
|
251
191
|
```ruby
|
252
|
-
setting_accessor :my_string, :
|
253
|
-
setting_accessor :my_number, :
|
192
|
+
setting_accessor :my_string, type: :string
|
193
|
+
setting_accessor :my_number, type: :integer
|
254
194
|
|
255
|
-
validates :my_string, :
|
256
|
-
validates :my_number, :
|
195
|
+
validates :my_string, presence: true
|
196
|
+
validates :my_number, numericality: {only_integer: true}
|
257
197
|
```
|
258
198
|
|
259
199
|
Contributing
|