attributes_for 0.6.1 → 0.7.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile.lock +3 -3
- data/README.md +46 -0
- data/app/helpers/attributes_for/rails/attributes_for_helper.rb +85 -44
- data/lib/attributes_for/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3341f8ea5c6de31880faa96f8566ae49c79b770d
|
4
|
+
data.tar.gz: 9e0d2c45a2be18135fcd985cae66f50cc4e7827f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d84163fccde09263dad397d39c36eb7d4d9c3fb3ec2dce7771af6f8c54a81f8968cf952af767149cf2070ff4447f9fbce0924d65f265396c640b8cf719f89b54
|
7
|
+
data.tar.gz: 09b735c044487a75e06ab3d6b3fde5b3d436cff6672adb7d445de37d7cef7b4413db0a83d2372194d89e6eaa826762790f93042917994e415b31a0ac54dbe771
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [0.7.0] - 2015-11-09
|
4
|
+
### Added
|
5
|
+
- Wrap label and value in tags.
|
6
|
+
- `:defaults` options. Apply same options to all elements.
|
7
|
+
- `:wrapper` options (change default wrappers).
|
8
|
+
- `:label_html` and `:value_html` to set attributes on tags.
|
9
|
+
### Changed
|
10
|
+
- Improved implementation slightly.
|
11
|
+
|
12
|
+
## [0.6.1] - 2015-10-29
|
13
|
+
### Changed
|
14
|
+
- Updated dependencies.
|
15
|
+
|
16
|
+
## [0.6.0] - 2015-10-21
|
17
|
+
### Added
|
18
|
+
- `date` and `datetime` helpers formats/converts to date and datetime.
|
19
|
+
|
3
20
|
## [0.5.1] - 2015-12-10
|
4
21
|
### Fixed
|
5
22
|
- `attribute` helper explicitly casts integer to string.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
attributes_for (0.
|
4
|
+
attributes_for (0.7.0)
|
5
5
|
chronic_duration (~> 0.10)
|
6
6
|
font-awesome-rails (~> 4.0)
|
7
7
|
phony (~> 2.0)
|
@@ -74,11 +74,11 @@ GEM
|
|
74
74
|
mime-types (2.6.2)
|
75
75
|
mini_portile (0.6.2)
|
76
76
|
minitest (5.8.2)
|
77
|
-
netrc (0.
|
77
|
+
netrc (0.11.0)
|
78
78
|
nokogiri (1.6.6.2)
|
79
79
|
mini_portile (~> 0.6.0)
|
80
80
|
numerizer (0.1.1)
|
81
|
-
phony (2.15.
|
81
|
+
phony (2.15.7)
|
82
82
|
rack (1.6.4)
|
83
83
|
rack-test (0.6.3)
|
84
84
|
rack (>= 1.0)
|
data/README.md
CHANGED
@@ -56,6 +56,8 @@ Present attributes using the API in the example below. It can also generate a
|
|
56
56
|
standard label value pair given an attribute name using the `attribute` method. Arbitrary
|
57
57
|
strings can also be presented using the `string` method.
|
58
58
|
|
59
|
+
Here is a complete example using all possible options.
|
60
|
+
|
59
61
|
```erb
|
60
62
|
<ul class="list-unstyled">
|
61
63
|
<%= attributes_for @company do |b| %>
|
@@ -83,6 +85,50 @@ strings can also be presented using the `string` method.
|
|
83
85
|
</ul>
|
84
86
|
```
|
85
87
|
|
88
|
+
Passing `:label_html` or `:value_html` to `#attribute` adds the given
|
89
|
+
options to the `label` and `value` wrapper tags.
|
90
|
+
|
91
|
+
```erb
|
92
|
+
<ul class="list-unstyled">
|
93
|
+
<%= attributes_for @product, defaults: { label_html: { class: 'label' } } do |b|
|
94
|
+
<li><%= b.attribute :price, icon: 'money', value_html: { class: 'pull-right' } %></li>
|
95
|
+
<% end %>
|
96
|
+
</ul>
|
97
|
+
```
|
98
|
+
|
99
|
+
Passing `:defaults` to `attributes_for` gives the option to all
|
100
|
+
attributes. This option you can typically use when you want add styling
|
101
|
+
to the label of each attribute.
|
102
|
+
|
103
|
+
```erb
|
104
|
+
<ul class="list-unstyled">
|
105
|
+
<%= attributes_for @company, defaults: { label_html: { class: 'label' } } do |b| %>
|
106
|
+
<li><%= b.attribute :name, icon: 'building-o' %></li>
|
107
|
+
<% end %>
|
108
|
+
</ul>
|
109
|
+
```
|
110
|
+
|
111
|
+
`attributes_for` wraps labels and values in `span` tags by default. Passing
|
112
|
+
`:wrappers` to `attributes_for` gives you the option to change the wrapper.
|
113
|
+
|
114
|
+
```erb
|
115
|
+
<ul class="list-unstyled">
|
116
|
+
<%= attributes_for @company, wrappers: { label: 'strong' } do |b| %>
|
117
|
+
<li><%= b.attribute :name, icon: 'building-o' %></li>
|
118
|
+
<% end %>
|
119
|
+
</ul>
|
120
|
+
```
|
121
|
+
|
122
|
+
Passing `:empty` to `attributes_for` overrides the default empty value.
|
123
|
+
|
124
|
+
```erb
|
125
|
+
<dl>
|
126
|
+
<%= attributes_for @company, wrappers: { label: 'dt', value: 'dd' }, empty: '-' do |b| %>
|
127
|
+
<%= b.attribute :fax %>
|
128
|
+
<% end %>
|
129
|
+
</dl>
|
130
|
+
```
|
131
|
+
|
86
132
|
## Options
|
87
133
|
|
88
134
|
Available options:
|
@@ -3,17 +3,25 @@ module AttributesFor
|
|
3
3
|
module AttributesForHelper
|
4
4
|
|
5
5
|
def attributes_for(object, options = {}, &block)
|
6
|
-
capture AttributeBuilder.new(object, self), &block
|
6
|
+
capture AttributeBuilder.new(object, self, options), &block
|
7
7
|
end
|
8
8
|
|
9
9
|
class AttributeBuilder
|
10
10
|
include ActionView::Helpers
|
11
11
|
include FontAwesome::Rails::IconHelper
|
12
12
|
|
13
|
-
attr_accessor :object, :template
|
13
|
+
attr_accessor :object, :template, :default_options, :wrappers,
|
14
|
+
:options
|
14
15
|
|
15
|
-
def initialize(object, template)
|
16
|
-
@object
|
16
|
+
def initialize(object, template, options = {})
|
17
|
+
@object = object
|
18
|
+
@template = template
|
19
|
+
@default_options = options[:defaults] || {}
|
20
|
+
|
21
|
+
@wrappers = { label: 'span', value: 'span' }
|
22
|
+
@wrappers.merge!(options.delete(:wrappers)) if options.key?(:wrappers)
|
23
|
+
|
24
|
+
@empty = options.delete(:empty) if options.key?(:empty)
|
17
25
|
end
|
18
26
|
|
19
27
|
def method_missing(method, *args, &block)
|
@@ -26,75 +34,108 @@ module AttributesFor
|
|
26
34
|
|
27
35
|
private
|
28
36
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
options[:icon] ||= icon_map(method)
|
33
|
-
|
34
|
-
wrap_content(human_name(attribute_name), content, options)
|
37
|
+
def empty_value
|
38
|
+
@empty || I18n.t('attributes_for.not_set')
|
35
39
|
end
|
36
40
|
|
37
|
-
def
|
38
|
-
value = object.public_send(attribute_name)
|
39
|
-
|
41
|
+
def build_value(method, attribute_name, options = {}, &block)
|
40
42
|
if block_given?
|
41
43
|
template.capture(&block)
|
42
|
-
elsif value.to_s.empty?
|
43
|
-
I18n.t "attributes_for.not_set"
|
44
44
|
else
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
when :date
|
49
|
-
I18n.l(value.to_date, format: options[:format])
|
50
|
-
when :datetime
|
51
|
-
I18n.l(value, format: options[:format])
|
52
|
-
when :duration
|
53
|
-
ChronicDuration.output(value, :keep_zero => true)
|
54
|
-
when :email
|
55
|
-
mail_to(value, value, title: human_name(attribute_name))
|
56
|
-
when :phone
|
57
|
-
phone_number = Phony.format(Phony.normalize(value.to_s), format: :international)
|
58
|
-
link_to(phone_number, "tel:#{phone_number}", title: human_name(attribute_name))
|
59
|
-
when :url
|
60
|
-
link_to(value, value, title: human_name(attribute_name))
|
45
|
+
value = object.public_send(attribute_name)
|
46
|
+
if value.to_s.empty?
|
47
|
+
empty_value
|
61
48
|
else
|
62
|
-
|
49
|
+
format_value(
|
50
|
+
method,
|
51
|
+
value,
|
52
|
+
options.reverse_merge(title: human_name(attribute_name))
|
53
|
+
)
|
63
54
|
end
|
64
55
|
end
|
65
56
|
end
|
66
57
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
|
58
|
+
def build_content(method, attribute_name, options = {}, &block)
|
59
|
+
value = build_value(method, attribute_name, options, &block)
|
60
|
+
|
61
|
+
options[:icon] ||= icon_map(method)
|
62
|
+
|
63
|
+
wrap_content(human_name(attribute_name), value, options)
|
64
|
+
end
|
71
65
|
|
72
|
-
|
73
|
-
|
66
|
+
def format_value(method, value, options = {})
|
67
|
+
case method.to_sym
|
68
|
+
when :boolean
|
69
|
+
I18n.t("attributes_for.#{value}")
|
70
|
+
when :date
|
71
|
+
I18n.l(value.to_date, format: options[:format])
|
72
|
+
when :datetime
|
73
|
+
I18n.l(value, format: options[:format])
|
74
|
+
when :duration
|
75
|
+
ChronicDuration.output(value, keep_zero: true)
|
76
|
+
when :email
|
77
|
+
mail_to(value, value, title: options[:title])
|
78
|
+
when :phone
|
79
|
+
phone_number = Phony.format(Phony.normalize(value.to_s),
|
80
|
+
format: :international)
|
81
|
+
link_to(phone_number, "tel:#{phone_number}", title: options[:title])
|
82
|
+
when :url
|
83
|
+
link_to(value, value, title: options[:title])
|
84
|
+
else
|
85
|
+
value.to_s
|
86
|
+
end
|
87
|
+
end
|
74
88
|
|
75
|
-
|
76
|
-
|
89
|
+
def wrap_content(label, value, options)
|
90
|
+
label_html_options = {}
|
91
|
+
label_html_options = options.delete(:label_html) if options.key?(:label_html)
|
92
|
+
|
93
|
+
value_html_options = {}
|
94
|
+
value_html_options = options.delete(:value_html) if options.key?(:value_html)
|
95
|
+
|
96
|
+
content = content_tag(
|
97
|
+
wrappers[:value],
|
98
|
+
value,
|
99
|
+
apply_default_options(:value_html, value_html_options)
|
100
|
+
)
|
101
|
+
|
102
|
+
unless options[:label] === false
|
103
|
+
content = content_tag(
|
104
|
+
wrappers[:label],
|
105
|
+
"#{label}:",
|
106
|
+
apply_default_options(:label_html, label_html_options)
|
107
|
+
) + ' ' + content
|
77
108
|
end
|
78
109
|
|
110
|
+
content = fa_icon(options[:icon], text: content) if options[:icon]
|
79
111
|
content
|
80
112
|
end
|
81
113
|
|
114
|
+
def apply_default_options(key, options)
|
115
|
+
if default_options.key?(key)
|
116
|
+
default_options[key].merge(options)
|
117
|
+
else
|
118
|
+
options
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
82
122
|
def human_name(attribute)
|
83
|
-
object
|
123
|
+
object
|
124
|
+
.class
|
125
|
+
.human_attribute_name(attribute, default: attribute.to_s.titleize)
|
84
126
|
end
|
85
127
|
|
86
128
|
def icon_map(method)
|
87
129
|
{
|
88
130
|
boolean: 'check',
|
89
131
|
date: 'calendar',
|
90
|
-
datetime:
|
132
|
+
datetime: 'calendar',
|
91
133
|
duration: 'clock-o',
|
92
134
|
email: 'envelope',
|
93
135
|
phone: 'phone',
|
94
|
-
url: 'globe'
|
136
|
+
url: 'globe'
|
95
137
|
}[method]
|
96
138
|
end
|
97
|
-
|
98
139
|
end
|
99
140
|
end
|
100
141
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attributes_for
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ole J. Rosendahl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10
|
11
|
+
date: 2015-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|