show_for 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e66b71c090111795d5eefc080a133ef63f3c752
4
- data.tar.gz: 6751105eb644a59ced4b9f3e96ce94c3ad791dc3
3
+ metadata.gz: bf7d8896e8ef6cf4029dec5b1be980ab4fdda13c
4
+ data.tar.gz: 8bcebe6966ece81c1485ce5fb94b691601817433
5
5
  SHA512:
6
- metadata.gz: 0e139c076881532aca65b6678797499cd4fafe74e32d620a993d17bc6ac4cfa734988f44b445b2ac245ae4cd86c5949ded1afad7fe5b12c2b3f4078b6f62936a
7
- data.tar.gz: 4626283fc1e8e5f72b987f986010e8f591e20a25cfb95a77553e0b9c9f86af356bc7670a610f310b1c9c73048f33e408b9a04aef0585b0801817896bfe0043db
6
+ metadata.gz: 2f87342c9090ec41e3e52e12a2aa5b78f54707060c26240b23d91f50a2f1883aa3c3e95c87b6d53064bf9c1168e2f12105db5c7c16caef43a5b9f1d0c287ec74
7
+ data.tar.gz: 90ae998a6a90834359f9df100d55e7fb525a3e5d97ecc0b90e6c70fcb311f93b9a6cfd2aee8e2931ef18448f9c46017298577306b337829562c10d8b4a5c77de
@@ -0,0 +1,117 @@
1
+ ## 0.4.0
2
+
3
+ ### enhancements
4
+ * Change default `wrapper_tag` to generate a `div` instead of `p`. The `p` tag generates
5
+ invalid HTML with collections: `p > ul`, and failed tests on Rails 4.2. If you depend
6
+ on the `p` tag being generated, change your Show For config to set `wrapper_tag` to `:p`.
7
+ * Remove deprecated `:method` in favor of `:using`.
8
+ * Improve support to Rails 4.x associations with more duck typing instead of Array checks.
9
+ * Support Rails 4.1/4.2 and Ruby 2.1/2.2.
10
+ * Add `skip_blanks` configuration option to skip generating blank attributes
11
+ instead of generating them with a default message. (by github.com/moktin)
12
+ * Add `slim` template for the install generator. (by github.com/voanhduy1512)
13
+ * Add `separator` option that overrides the global configuration (by github.com/bernardofire)
14
+
15
+ ### bugfix
16
+ * Do not yield default blank value to the block when using an empty association. (by github.com/aptinio)
17
+
18
+ ## 0.3.0
19
+
20
+ ### bug fix
21
+ * Fix blank value not being applied when using a block. (by github.com/tfwright)
22
+
23
+ ## 0.3.0.rc
24
+
25
+ ### enhancements
26
+ * Support Rails 4.
27
+ * Drop support to Rails < 3.2 and Ruby 1.8.
28
+
29
+ ## 0.2.6
30
+
31
+ ### enhancements
32
+ * Ruby 2.0 support.
33
+ * Add Haml template. (by github.com/nashby) Closes #12.
34
+ * Add `blank_html` tanslation. (by github.com/nashby)
35
+ * Add `show_for_class` configuration option. (by github.com/nashby)
36
+
37
+ ### bug fix
38
+ * Make show_for works with namespaced models. (by github.com/fabiokr)
39
+ * Add `blank_content_class` to the attributes. (by github.com/blakehilscher). Closes #24.
40
+ * Don't call `association.map` if association method is nil (by github.com/nashby). Closes #40.
41
+
42
+ ## 0.2.5
43
+
44
+ ### enhancements
45
+ * Add a `:value` option for attribute (by github.com/ml-gt)
46
+ * Add `label_class`, `content_class`, `wrapper_class` and `collection_class` configuration options (by github.com/wojtekmach)
47
+
48
+ ### bug fix
49
+ * Fix problem with `label => false` and `html_safe` (label => false) (by github.com/nashby)
50
+
51
+ ## 0.2.4
52
+
53
+ ### enhancements
54
+ * Do not add separator if label is not present (by github.com/eugenebolshakov)
55
+ * Add method for output value only (by github.com/jenkek)
56
+
57
+ ### bug fix
58
+ * Fix empty labels to be `html_safe` (label => false) (by github.com/eugenebolshakov)
59
+
60
+ ## 0.2.3
61
+
62
+ ### enhancements
63
+ * added :attributes method to generate all attributes given
64
+ * update generator to use the new syntax show_for:install
65
+
66
+ ### bug fix
67
+ * fix numeric types
68
+
69
+ ## 0.2.2
70
+
71
+ ### bug fix
72
+ * allow show_for to work with AR association proxies
73
+
74
+ ### enhancements
75
+ * improvements on html safe and output buffers
76
+
77
+ ## 0.2.1
78
+
79
+ ### enhancements
80
+ * added label_proc
81
+ * compatibility with latest Rails
82
+
83
+ ## 0.2.0
84
+
85
+ ### enhancements
86
+ * Rails 3 compatibility
87
+
88
+ ## 0.1.4
89
+
90
+ ### bug fix
91
+ * allow show_for to work with AR association proxies
92
+
93
+ ## 0.1.3
94
+
95
+ ### enhancements
96
+ * allow builder to be given to show_for
97
+
98
+ ### bug fix
99
+ * Fix typo in yaml
100
+
101
+ ## 0.1.2
102
+
103
+ ### enhancements
104
+ * allow `f.attribute :nickname, :in => :profile` as association shortcut
105
+
106
+ ### deprecations
107
+ * `:method` now becomes `:using`
108
+
109
+ ## 0.1.1
110
+
111
+ ### enhancements
112
+ * HAML compatibility (by github.com/grimen)
113
+ * blank_content support (by github.com/grimen)
114
+
115
+ ## 0.1
116
+
117
+ ### First release
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2014 PlataformaTec http://blog.plataformatec.com.br/
1
+ Copyright (c) 2012-2015 Plataformatec http://plataformatec.com.br/
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -0,0 +1,225 @@
1
+ # ShowFor
2
+
3
+ [![Gem Version](https://fury-badge.herokuapp.com/rb/show_for.png)](http://badge.fury.io/rb/show_for)
4
+ [![Build Status](https://api.travis-ci.org/plataformatec/show_for.png?branch=master)](http://travis-ci.org/plataformatec/show_for)
5
+ [![Code Climate](https://codeclimate.com/github/plataformatec/show_for.png)](https://codeclimate.com/github/plataformatec/show_for)
6
+
7
+ ShowFor allows you to quickly show a model information with I18n features.
8
+
9
+ ```erb
10
+ <%= show_for @user do |u| %>
11
+ <%= u.attribute :name %>
12
+ <%= u.attribute :nickname, :in => :profile %>
13
+ <%= u.attribute :confirmed? %>
14
+ <%= u.attribute :created_at, :format => :short %>
15
+ <%= u.attribute :last_sign_in_at, :if_blank => "User did not access yet",
16
+ :wrapper_html => { :id => "sign_in_timestamp" } %>
17
+
18
+ <%= u.attribute :photo do %>
19
+ <%= image_tag(@user.photo_url) %>
20
+ <% end %>
21
+
22
+ <%= u.association :company %>
23
+ <%= u.association :tags, :to_sentence => true %>
24
+ <% end %>
25
+ ```
26
+
27
+ ## Installation
28
+
29
+ Install the gem:
30
+
31
+ gem install show_for
32
+
33
+ Or add ShowFor to your Gemfile and bundle it up:
34
+
35
+ gem 'show_for'
36
+
37
+ Run the generator:
38
+
39
+ rails generate show_for:install
40
+
41
+ And you are ready to go.
42
+
43
+ Note: This branch aims Rails 3.2 and 4 support, so if you want to use it with
44
+ older versions of Rails, check out the available branches.
45
+
46
+ ## Usage
47
+
48
+ ShowFor allows you to quickly show a model information with I18n features.
49
+
50
+ ```erb
51
+ <%= show_for @admin do |a| %>
52
+ <%= a.attribute :name %>
53
+ <%= a.attribute :login, :value => :upcase %>
54
+ <%= a.attribute :confirmed? %>
55
+ <%= a.attribute :created_at, :format => :short %>
56
+ <%= a.attribute :last_sign_in_at, :if_blank => "Administrator did not access yet"
57
+ :wrapper_html => { :id => "sign_in_timestamp" } %>
58
+
59
+ <%= a.attribute :photo do %>
60
+ <%= image_tag(@admin.photo_url) %>
61
+ <% end %>
62
+
63
+ <% a.value :biography %>
64
+ <% end %>
65
+ ```
66
+
67
+ Will generate something like:
68
+
69
+ ```html
70
+ <div id="admin_1" class="show_for admin">
71
+ <div class="wrapper admin_name">
72
+ <strong class="label">Name</strong><br />
73
+ José Valim
74
+ </div>
75
+ <div class="wrapper admin_login">
76
+ <strong class="label">Login</strong><br />
77
+ JVALIM
78
+ </div>
79
+ <div class="wrapper admin_confirmed">
80
+ <strong class="label">Confirmed?</strong><br />
81
+ Yes
82
+ </div>
83
+ <div class="wrapper admin_created_at">
84
+ <strong class="label">Created at</strong><br />
85
+ 13/12/2009 - 19h17
86
+ </div>
87
+ <div id="sign_in_timestamp" class="wrapper admin_last_sign_in_at">
88
+ <strong class="label">Last sign in at</strong><br />
89
+ Administrator did not access yet
90
+ </div>
91
+ <div class="wrapper admin_photo">
92
+ <strong class="label">Photo</strong><br />
93
+ <img src="path/to/photo" />
94
+ </div>
95
+ <div class="wrapper admin_biography">
96
+ Etiam porttitor eros ut diam vestibulum et blandit lectus tempor. Donec
97
+ venenatis fermentum nunc ac dignissim. Pellentesque volutpat eros quis enim
98
+ mollis bibendum. Ut cursus sem ac sem accumsan nec porttitor felis luctus.
99
+ Sed purus nunc, auctor vitae consectetur pharetra, tristique non nisi.
100
+ </div>
101
+ </div>
102
+ ```
103
+
104
+ You can also show a list of attributes, useful if you don't need to change any configuration:
105
+
106
+ ```erb
107
+ <%= show_for @admin do |a| %>
108
+ <%= a.attributes :name, :confirmed?, :created_at %>
109
+ <% end %>
110
+ ```
111
+
112
+ ## Value lookup
113
+
114
+ ShowFor uses the following sequence to get the attribute value:
115
+
116
+ * use the output of a block argument if given
117
+ * use the output of the `:value` argument if given
118
+ * check if a `:"human_#{attribute}"` method is defined
119
+ * retrieve the attribute directly.
120
+
121
+ ## Options
122
+
123
+ ShowFor handles a series of options. Those are:
124
+
125
+ * __:format__ - Sent to `I18n.localize` when the attribute is a date/time object.
126
+
127
+ * __:value__ - Can be used instead of block. If a `Symbol` is called as instance method.
128
+
129
+ * __:if_blank__ - An object to be used if the value is blank. Not escaped as well.
130
+
131
+ * __:separator__ - The piece of html that separates label and content, overriding the global configuration.
132
+
133
+ In addition, all containers (`:label`, `:content` and `:wrapper`) can have their html
134
+ options configured through the `:label_html`, `:content_html` and `:wrapper_html`
135
+ options. Containers can have their tags configured on demand as well through
136
+ `:label_tag,` `:content_tag` and `:wrapper_tag` options.
137
+
138
+ ## Label
139
+
140
+ ShowFor also exposes the label method. In case you want to use the default
141
+ `human_attribute_name` lookup and the default wrapping:
142
+
143
+ ```ruby
144
+ a.label :name #=> <strong class="label">Name</strong>
145
+ a.label "Name", :id => "my_name" #=> <strong class="label" id="my_name">Name</strong>
146
+ ```
147
+
148
+ Optionally, if you want to wrap the inner part of the label with some text
149
+ (e.g. adding a semicolon), you can do so by specifying a proc for `ShowFor.label_proc`
150
+ that will be called with any label text. E.g.:
151
+
152
+ ```ruby
153
+ ShowFor.label_proc = lambda { |l| l + ":" }
154
+ ```
155
+
156
+ When taking this route, you can also skip on a per label basis by passing the
157
+ `:wrap_label` option with a value of false.
158
+
159
+ ## Associations
160
+
161
+ ShowFor also supports associations.
162
+
163
+ ```erb
164
+ <%= show_for @artwork do |a| %>
165
+ <%= a.association :artist %>
166
+ <%= a.association :artist, :using => :name_with_title %>
167
+ <%= a.attribute :name_with_title, :in => :artist %>
168
+
169
+ <%= a.association :tags %>
170
+ <%= a.association :tags, :to_sentence => true %>
171
+ <%= a.association :tags do
172
+ @artwork.tags.map(&:name).to_sentence
173
+ end %>
174
+
175
+ <%= a.association :fans, :collection_tag => :ol do |fan| %>
176
+ <li><%= link_to fan.name, fan %></li>
177
+ <% end %>
178
+ <% end %>
179
+ ```
180
+
181
+ The first is a `has_one` or `belongs_to` association, which works like an attribute
182
+ to ShowFor, except it will retrieve the artist association and try to find a
183
+ proper method from `ShowFor.association_methods` to be used. You can pass
184
+ the option :using to tell (and not guess) which method from the association
185
+ to use.
186
+
187
+ :tags is a `has_and_belongs_to_many` association which will return a collection.
188
+ ShowFor can handle collections by default by wrapping them in list (`<ul>` with
189
+ each item wrapped by an `<li>`). However, it also allows you to give `:to_sentence`
190
+ or `:join` it you want to render them inline.
191
+
192
+ You can also pass a block which expects an argument to association. In such cases,
193
+ a wrapper for the collection is still created and the block just iterates over the
194
+ collection objects.
195
+
196
+ Here are some other examples of the many possibilites to custom the output content:
197
+
198
+ ```erb
199
+ <%= u.association :relationships, :label => 'test' do %>
200
+ <% @user.relationships.each do |relation| %>
201
+ <%= relation.related_user.name if relation.related_user_role == 'supervisor' %>
202
+ <% end %>
203
+ <% end %>
204
+
205
+ <%= u.attribute :gender do %>
206
+ <%= content_tag :span, t("helpers.enum_select.user.gender.#{@user.gender}") %>
207
+ <% end %>
208
+ ```
209
+
210
+ ## Maintainers
211
+
212
+ * José Valim (http://github.com/josevalim)
213
+ * Carlos Antonio da Silva (https://github.com/carlosantoniodasilva)
214
+
215
+ ## Contributors
216
+
217
+ * Jonas Grimfelt (http://github.com/grimen)
218
+
219
+ ## Bugs and Feedback
220
+
221
+ If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.
222
+
223
+ http://github.com/plataformatec/show_for/issues
224
+
225
+ MIT License. Copyright 2012-2015 Plataformatec. http://plataformatec.com.br
@@ -0,0 +1,8 @@
1
+ = show_for(@<%= singular_name %>) do |s|
2
+ <%- attributes.each do |attribute| -%>
3
+ = s.<%= attribute.reference? ? :association : :attribute %> :<%= attribute.name %>
4
+ <% end -%>
5
+
6
+ = link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>)
7
+ |
8
+ = link_to 'Back', <%= plural_name %>_path
@@ -9,21 +9,36 @@ ShowFor.setup do |config|
9
9
  # The tag which wraps each attribute/association call. Default is :p.
10
10
  # config.wrapper_tag = :dl
11
11
 
12
+ # The DOM class set for the wrapper tag. Default is :wrapper.
13
+ # config.wrapper_class = :custom
14
+
12
15
  # The tag used to wrap each label. Default is :strong.
13
16
  # config.label_tag = :dt
14
17
 
18
+ # The DOM class of each label tag. Default is :label.
19
+ # config.label_class = :custom
20
+
15
21
  # The tag used to wrap each content (value). Default is nil.
16
22
  # config.content_tag = :dd
17
23
 
24
+ # The DOM class of each content tag. Default is :content.
25
+ # config.content_class = :custom
26
+
18
27
  # The DOM class set for blank content tags. Default is "blank".
19
28
  # config.blank_content_class = 'no_content'
20
29
 
30
+ # Skip blank attributes instead of generating with a default message. Default is false.
31
+ # config.skip_blanks = true
32
+
21
33
  # The separator between label and content. Default is "<br />".
22
34
  # config.separator = "<br />"
23
35
 
24
36
  # The tag used to wrap collections. Default is :ul.
25
37
  # config.collection_tag = :ul
26
38
 
39
+ # The DOM class set for the collection tag. Default is :collection.
40
+ # config.collection_class = :custom
41
+
27
42
  # The default iterator to be used when invoking a collection/association.
28
43
  # config.default_collection_proc = lambda { |value| "<li>#{ERB::Util.h(value)}</li>".html_safe }
29
44
 
@@ -28,8 +28,11 @@ module ShowFor
28
28
  mattr_accessor :blank_content_class
29
29
  @@blank_content_class = "blank"
30
30
 
31
+ mattr_accessor :skip_blanks
32
+ @@skip_blanks = false
33
+
31
34
  mattr_accessor :wrapper_tag
32
- @@wrapper_tag = :p
35
+ @@wrapper_tag = :div
33
36
 
34
37
  mattr_accessor :wrapper_class
35
38
  @@wrapper_class = :wrapper
@@ -38,17 +38,11 @@ module ShowFor
38
38
  protected
39
39
 
40
40
  def values_from_association(association, options) #:nodoc:
41
- sample = association.is_a?(Array) ? association.first : association
42
-
43
- if options[:method]
44
- options[:using] = options.delete(:method)
45
- ActiveSupport::Deprecation.warn ":method is deprecated. Please use :using instead", caller
46
- end
47
-
41
+ sample = association.respond_to?(:to_ary) ? association.first : association
48
42
  method = options.delete(:using) || ShowFor.association_methods.find { |m| sample.respond_to?(m) }
49
43
 
50
44
  if method
51
- association.is_a?(Array) ? association.map(&method) : association.try(method)
45
+ association.respond_to?(:to_ary) ? association.map(&method) : association.try(method)
52
46
  end
53
47
  end
54
48
  end
@@ -32,8 +32,11 @@ module ShowFor
32
32
  end
33
33
 
34
34
  def wrap_label_and_content(name, value, options, &block) #:nodoc:
35
+ return if skip_blanks?(value)
35
36
  label = label(name, options, false)
36
- label += ShowFor.separator.to_s.html_safe if label.present?
37
+ if label.present? && separator = options.fetch(:separator) { ShowFor.separator }
38
+ label += separator.html_safe
39
+ end
37
40
  wrap_with(:wrapper, label + content(value, options, false, &block), apply_wrapper_options!(:wrapper, options, value))
38
41
  end
39
42
 
@@ -58,6 +61,7 @@ module ShowFor
58
61
  # around the given content. It also check for html_options in @options
59
62
  # hash related to the current type.
60
63
  def wrap_with(type, content, options) #:nodoc:
64
+ return if skip_blanks?(content)
61
65
  tag = options.delete(:"#{type}_tag") || ShowFor.send(:"#{type}_tag")
62
66
 
63
67
  if tag
@@ -75,6 +79,11 @@ module ShowFor
75
79
  def collection_block?(block) #:nodoc:
76
80
  block && block.arity == 1
77
81
  end
82
+
83
+ # Verifies whether the value is blank and its configured to skip blank values.
84
+ def skip_blanks?(value) #:nodoc:
85
+ ShowFor.skip_blanks && value.blank? && value != false
86
+ end
78
87
  end
79
88
  end
80
89