action_params_permitter 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +14 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +21 -0
- data/README.md +139 -0
- data/Rakefile +6 -0
- data/action_params_permitter.gemspec +26 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/action_params_permitter.rb +26 -0
- data/lib/action_params_permitter/base.rb +39 -0
- data/lib/action_params_permitter/builders/concerns/resource_requiring.rb +33 -0
- data/lib/action_params_permitter/builders/concerns/top_level_resource_block_existence_checking.rb +20 -0
- data/lib/action_params_permitter/builders/main.rb +71 -0
- data/lib/action_params_permitter/builders/resource.rb +66 -0
- data/lib/action_params_permitter/errors.rb +4 -0
- data/lib/action_params_permitter/permit_processor.rb +45 -0
- data/lib/action_params_permitter/version.rb +3 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f23d83ff4d7fe631eb3e9f7f72cbad5c354da27f
|
4
|
+
data.tar.gz: 3df5990081a00f38602390170ba40642e594b8cb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 447c2bf813fde97541de737a9a4b9996cd99d8b895bf8e9761e11c076211f1def784578354cde0f3910912405a5e8ab1f61f0b0c9f2f75415756592261d4a19b
|
7
|
+
data.tar.gz: 1fc785928a20185ad4db06edab8c9654d1cbccd2e566f76f15fd5e799cfa2fb0a35a586b41456b7d81998b384ae84181e2277e3277e9b8e79d04a5d5f4176a8b
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
before_install: gem install bundler -v 1.10.6
|
4
|
+
|
5
|
+
cache: bundler
|
6
|
+
|
7
|
+
rvm:
|
8
|
+
- 2.2.2
|
9
|
+
|
10
|
+
script: 'CODECLIMATE_REPO_TOKEN=5924b5a882e5cec32dfae43025aafac9164fc772aa776e6249a9430713ca56ed bundle exec rake'
|
11
|
+
|
12
|
+
addons:
|
13
|
+
code_climate:
|
14
|
+
repo_token: 5924b5a882e5cec32dfae43025aafac9164fc772aa776e6249a9430713ca56ed
|
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
4
|
+
|
5
|
+
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
|
6
|
+
|
7
|
+
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
8
|
+
|
9
|
+
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
10
|
+
|
11
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
|
12
|
+
|
13
|
+
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development, :test do
|
6
|
+
gem 'pry-nav', '0.2.4'
|
7
|
+
gem 'faker', '1.4.3'
|
8
|
+
gem 'rspec-rails', '3.3.2'
|
9
|
+
gem 'rspec-its', '1.2.0'
|
10
|
+
gem 'shoulda-matchers', '2.8.0'
|
11
|
+
gem 'fabrication', '2.14.0'
|
12
|
+
end
|
13
|
+
|
14
|
+
gem "codeclimate-test-reporter", group: :test, require: nil
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Sergey Gernyak
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# ActionParamsPermitter
|
2
|
+
|
3
|
+
[![Code Climate](https://codeclimate.com/github/alterego-labs/action_params_permitter/badges/gpa.svg)](https://codeclimate.com/github/alterego-labs/action_params_permitter)
|
4
|
+
[![Build Status](https://travis-ci.org/alterego-labs/action_params_permitter.svg)](https://travis-ci.org/alterego-labs/action_params_permitter)
|
5
|
+
[![Test Coverage](https://codeclimate.com/github/alterego-labs/action_params_permitter/badges/coverage.svg)](https://codeclimate.com/github/alterego-labs/action_params_permitter/coverage)
|
6
|
+
|
7
|
+
Strong Parameters are the great idea to keep your models clean. But what
|
8
|
+
about controllers when form is very complex and
|
9
|
+
`params.require(:anything).permit!` does not helps?
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
class AnyController
|
13
|
+
private
|
14
|
+
|
15
|
+
def permitted_params
|
16
|
+
params.permit tutorial: [
|
17
|
+
:cost, :hours, :minutes, :seconds,
|
18
|
+
steps_attributes: [:id, :description, :order_number, :_destroy],
|
19
|
+
tool_ids: [],
|
20
|
+
material_ids: [],
|
21
|
+
post_attributes: [
|
22
|
+
:id, :title, :description, :meta_title, :meta_description,
|
23
|
+
:feature, :user_id, tag_list: [], category_ids: []],
|
24
|
+
media: [:id, :title, :alt, :_destroy]
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
This code seems not so clean.
|
32
|
+
|
33
|
+
`action_params_permitter` gives you a alternative way to do permitting
|
34
|
+
more clean.
|
35
|
+
|
36
|
+
## Installation
|
37
|
+
|
38
|
+
Add this line to your application's Gemfile:
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
gem 'action_params_permitter', github: 'alterego-labs/action_params_permitter'
|
42
|
+
```
|
43
|
+
|
44
|
+
And then execute:
|
45
|
+
|
46
|
+
$ bundle
|
47
|
+
|
48
|
+
## Usage
|
49
|
+
|
50
|
+
In general provided DSL looks like follow:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
SomePermitter = ActionParamsPermitter::Base.new do
|
54
|
+
# Your specific rules
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
Rules are predefined and their variation are listed below:
|
59
|
+
|
60
|
+
1. `resource`
|
61
|
+
2. `attribute`
|
62
|
+
3. `attributes`
|
63
|
+
|
64
|
+
Nesting is allowed but only for `resource` (which is quite logical). There are some statements about resource rule:
|
65
|
+
|
66
|
+
1. _Top level resource_ __always must__ accepts nestings rules otherwise
|
67
|
+
exception will be raised.
|
68
|
+
2. _Top level resource_ may be __required__, but only one otherwise
|
69
|
+
exception will be raised.
|
70
|
+
3. _Nested resource_ may not accepts nestings rules.
|
71
|
+
|
72
|
+
Lets define permitter for our example in the top of readme:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
TutorialsParamsPermitter = ActionParamsPermitter::Base.new do
|
76
|
+
resource :tutorial do
|
77
|
+
attributes :cost, :hours, :minutes, :seconds
|
78
|
+
resource :steps_attributes do
|
79
|
+
attributes :id, :description, :order_number, :_destroy
|
80
|
+
end
|
81
|
+
resource :tool_ids
|
82
|
+
resource :material_ids
|
83
|
+
resource :post_attributes do
|
84
|
+
attributes :id, :title, :description, :meta_title, :meta_description
|
85
|
+
attributes :feature, :user_id
|
86
|
+
resource :tag_list
|
87
|
+
resource :category_ids
|
88
|
+
end
|
89
|
+
resource :media do
|
90
|
+
# Written specially for showing `attribute` rule in work
|
91
|
+
attribute :id
|
92
|
+
attribute :title
|
93
|
+
attribute :alt
|
94
|
+
attribute :_destroy
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
`TutorialsParamsPermitter` respond to `#permit(params)` method. And now
|
101
|
+
we may refactor our controller's method like this:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
class AnyController
|
105
|
+
private
|
106
|
+
|
107
|
+
def permitted_params
|
108
|
+
TutorialsParamsPermitter.permit(params)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
You may define root resource as required like this:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
TutorialsParamsPermitter = ActionParamsPermitter::Base.new do
|
117
|
+
resource :tutorial, required: true do
|
118
|
+
...
|
119
|
+
end
|
120
|
+
end
|
121
|
+
```
|
122
|
+
|
123
|
+
## Usage with Form Object gems
|
124
|
+
|
125
|
+
There are many gems providing form objects, for example `reform`. And if you use a such one `action_params_permitter` is not helps you. Form Object gems inside carries same functional and `action_params_permitter` usage is excessive.
|
126
|
+
|
127
|
+
## What about like `params.require(:any_resource).permit!`?
|
128
|
+
|
129
|
+
Notice, please, this gem was written only for complex params permitting.
|
130
|
+
Usage for so simple example is excessive.
|
131
|
+
|
132
|
+
## Contributing
|
133
|
+
|
134
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/alterego-labs/action_params_permitter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
135
|
+
|
136
|
+
## License
|
137
|
+
|
138
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
139
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'action_params_permitter/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "action_params_permitter"
|
8
|
+
spec.version = ActionParamsPermitter::VERSION
|
9
|
+
spec.authors = ["Sergey Gernyak"]
|
10
|
+
spec.email = ["sergeg1990@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Helps to permit income parameters more clearly.}
|
13
|
+
spec.homepage = "https://github.com/alterego-labs/action_params_permitter"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency 'rails', '~> 4.2.4'
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "action_params_permitter"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "action_params_permitter/version"
|
2
|
+
|
3
|
+
require 'active_support/dependencies/autoload'
|
4
|
+
|
5
|
+
require "action_params_permitter/errors"
|
6
|
+
|
7
|
+
module ActionParamsPermitter
|
8
|
+
extend ActiveSupport::Autoload
|
9
|
+
|
10
|
+
autoload :Base
|
11
|
+
autoload :PermitProcessor
|
12
|
+
|
13
|
+
module Builders
|
14
|
+
extend ActiveSupport::Autoload
|
15
|
+
|
16
|
+
autoload :Main
|
17
|
+
autoload :Resource
|
18
|
+
|
19
|
+
module Concerns
|
20
|
+
extend ActiveSupport::Autoload
|
21
|
+
|
22
|
+
autoload :TopLevelResourceBlockExistenceChecking
|
23
|
+
autoload :ResourceRequiring
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ActionParamsPermitter
|
2
|
+
#
|
3
|
+
# Entry for creating custom permitters
|
4
|
+
#
|
5
|
+
class Base
|
6
|
+
def initialize(&block)
|
7
|
+
builder.instance_eval(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# Provides hash that must be passed to `permit` method.
|
12
|
+
#
|
13
|
+
# Returns:
|
14
|
+
# generated hash of permitter definition
|
15
|
+
#
|
16
|
+
def hash_for_permitting
|
17
|
+
builder.state
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Calls permitting income params using permitter definition
|
22
|
+
#
|
23
|
+
# Parameters:
|
24
|
+
# params - instance of ActionController::Parameters
|
25
|
+
#
|
26
|
+
# Returns:
|
27
|
+
# hash of permitted params
|
28
|
+
#
|
29
|
+
def permit(params)
|
30
|
+
PermitProcessor.new(params, builder).call
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def builder
|
36
|
+
@_builder ||= Builders::Main.new({})
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ActionParamsPermitter
|
2
|
+
module Builders
|
3
|
+
module Concerns
|
4
|
+
module ResourceRequiring
|
5
|
+
def self.prepended(base)
|
6
|
+
base.instance_eval do
|
7
|
+
attr_reader :is_required
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(*params)
|
12
|
+
@is_required = false
|
13
|
+
super(*params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def resource(name, options = {}, &block)
|
17
|
+
check_double_requiring(options)
|
18
|
+
@is_required = true if options.fetch(:required, false)
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def check_double_requiring(options)
|
25
|
+
return if !top_level_builder?
|
26
|
+
return if !is_required
|
27
|
+
return if !options[:required]
|
28
|
+
raise ActionParamsPermitter::DoubleRequireError, 'You may define only one required top level resource!'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/action_params_permitter/builders/concerns/top_level_resource_block_existence_checking.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module ActionParamsPermitter
|
2
|
+
module Builders
|
3
|
+
module Concerns
|
4
|
+
module TopLevelResourceBlockExistenceChecking
|
5
|
+
def resource(name, options = {}, &block)
|
6
|
+
check_block_existence(&block)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def check_block_existence(&block)
|
13
|
+
return if !top_level_builder?
|
14
|
+
return if block_given?
|
15
|
+
raise ActionParamsPermitter::TopLevelResourceWithoutBlockError, 'Top level resource must has block!'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module ActionParamsPermitter
|
2
|
+
module Builders
|
3
|
+
#
|
4
|
+
# Provides context for building permitters
|
5
|
+
#
|
6
|
+
# Parameters:
|
7
|
+
# state - initial state for builder
|
8
|
+
#
|
9
|
+
class Main
|
10
|
+
prepend Concerns::TopLevelResourceBlockExistenceChecking
|
11
|
+
prepend Concerns::ResourceRequiring
|
12
|
+
|
13
|
+
attr_reader :state
|
14
|
+
|
15
|
+
def initialize(state)
|
16
|
+
@state = state
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Adds intention for resource permitting
|
21
|
+
#
|
22
|
+
# Parameters:
|
23
|
+
# name - name of the permitting resource
|
24
|
+
# options - hash with options. Available are:
|
25
|
+
# required - true/false. Required may be only top level resource and only one.
|
26
|
+
#
|
27
|
+
# Returns:
|
28
|
+
# new state
|
29
|
+
#
|
30
|
+
def resource(name, options = {}, &block)
|
31
|
+
Builders::Resource.new(name, state).call(&block)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Adds intention for attribute permitting
|
36
|
+
#
|
37
|
+
# Parameters:
|
38
|
+
# name - name of the permitting attribute
|
39
|
+
#
|
40
|
+
# Returns:
|
41
|
+
# new state
|
42
|
+
#
|
43
|
+
def attribute(name)
|
44
|
+
state << name
|
45
|
+
state
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Adds intention for attributes permitting.
|
50
|
+
# Works exactly as a `attribute` but accepts
|
51
|
+
# array of attributes
|
52
|
+
#
|
53
|
+
# Parameters:
|
54
|
+
# names - names of the permitting attributes
|
55
|
+
#
|
56
|
+
# Returns:
|
57
|
+
# new state
|
58
|
+
#
|
59
|
+
def attributes(*names)
|
60
|
+
names.each { |name| attribute(name) }
|
61
|
+
state
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def top_level_builder?
|
67
|
+
state.is_a?(Hash)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ActionParamsPermitter
|
2
|
+
module Builders
|
3
|
+
#
|
4
|
+
# Command class for building hash for permitting resource
|
5
|
+
#
|
6
|
+
# Parameters:
|
7
|
+
# name - name of the building resource
|
8
|
+
# state - current state of the builder
|
9
|
+
#
|
10
|
+
# Returns:
|
11
|
+
# new state
|
12
|
+
#
|
13
|
+
class Resource
|
14
|
+
attr_reader :name, :state
|
15
|
+
|
16
|
+
def initialize(name, state)
|
17
|
+
@name, @state = name, state
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(&block)
|
21
|
+
if hash_state?
|
22
|
+
process_hash_state(&block)
|
23
|
+
else
|
24
|
+
process_array_state(&block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def hash_state?
|
31
|
+
state.is_a?(Hash)
|
32
|
+
end
|
33
|
+
|
34
|
+
def process_hash_state(&block)
|
35
|
+
state[name] = gen_empty_builder(&block)
|
36
|
+
state
|
37
|
+
end
|
38
|
+
|
39
|
+
def process_array_state(&block)
|
40
|
+
sub_state = gen_sub_state(&block)
|
41
|
+
if state_has_hash?
|
42
|
+
child_hash.merge!(name => sub_state)
|
43
|
+
else
|
44
|
+
state << {name => sub_state }
|
45
|
+
end
|
46
|
+
state
|
47
|
+
end
|
48
|
+
|
49
|
+
def gen_sub_state(&block)
|
50
|
+
block_given? ? gen_empty_builder(&block) : []
|
51
|
+
end
|
52
|
+
|
53
|
+
def gen_empty_builder(&block)
|
54
|
+
Builders::Main.new([]).instance_eval(&block) || []
|
55
|
+
end
|
56
|
+
|
57
|
+
def child_hash
|
58
|
+
state.detect {|el| el.is_a?(Hash)}
|
59
|
+
end
|
60
|
+
|
61
|
+
def state_has_hash?
|
62
|
+
!child_hash.nil?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'active_support/core_ext/module/delegation'
|
2
|
+
|
3
|
+
module ActionParamsPermitter
|
4
|
+
#
|
5
|
+
# Makes permitting process.
|
6
|
+
# It can be done using income params from
|
7
|
+
# your controller and builded permitter
|
8
|
+
#
|
9
|
+
# Parameters:
|
10
|
+
# params - instance of ActionController::Parameters
|
11
|
+
# builder - instance of Builders::Main
|
12
|
+
#
|
13
|
+
# Returns:
|
14
|
+
# hash with permitted parameters
|
15
|
+
#
|
16
|
+
class PermitProcessor
|
17
|
+
attr_reader :params, :builder
|
18
|
+
|
19
|
+
delegate :state, to: :builder
|
20
|
+
|
21
|
+
def initialize(params, builder)
|
22
|
+
@params, @builder = params, builder
|
23
|
+
end
|
24
|
+
|
25
|
+
def call
|
26
|
+
top_is_required? ? make_requiring : make_permitting
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def make_permitting
|
32
|
+
params.permit(state)
|
33
|
+
end
|
34
|
+
|
35
|
+
def make_requiring
|
36
|
+
required_resource = state.keys.first
|
37
|
+
required_tail = state[required_resource]
|
38
|
+
params.require(required_resource).permit(required_tail)
|
39
|
+
end
|
40
|
+
|
41
|
+
def top_is_required?
|
42
|
+
builder.is_required
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: action_params_permitter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sergey Gernyak
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.2.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.2.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- sergeg1990@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".travis.yml"
|
79
|
+
- CODE_OF_CONDUCT.md
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- action_params_permitter.gemspec
|
85
|
+
- bin/console
|
86
|
+
- bin/setup
|
87
|
+
- lib/action_params_permitter.rb
|
88
|
+
- lib/action_params_permitter/base.rb
|
89
|
+
- lib/action_params_permitter/builders/concerns/resource_requiring.rb
|
90
|
+
- lib/action_params_permitter/builders/concerns/top_level_resource_block_existence_checking.rb
|
91
|
+
- lib/action_params_permitter/builders/main.rb
|
92
|
+
- lib/action_params_permitter/builders/resource.rb
|
93
|
+
- lib/action_params_permitter/errors.rb
|
94
|
+
- lib/action_params_permitter/permit_processor.rb
|
95
|
+
- lib/action_params_permitter/version.rb
|
96
|
+
homepage: https://github.com/alterego-labs/action_params_permitter
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.4.8
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: Helps to permit income parameters more clearly.
|
120
|
+
test_files: []
|