show_for 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +4 -2
- data/lib/show_for/association.rb +52 -0
- data/lib/show_for/attribute.rb +18 -0
- data/lib/show_for/builder.rb +8 -45
- data/lib/show_for/content.rb +0 -6
- data/lib/show_for/helper.rb +1 -1
- data/lib/show_for/version.rb +1 -1
- data/test/builder_test.rb +23 -12
- data/test/helper_test.rb +6 -6
- metadata +3 -1
data/README.rdoc
CHANGED
@@ -4,6 +4,7 @@ ShowFor allows you to quickly show a model information with I18n features.
|
|
4
4
|
|
5
5
|
<% show_for @user do |u| %>
|
6
6
|
<%= u.attribute :name %>
|
7
|
+
<%= u.attribute :nickname, :in => :profile %>
|
7
8
|
<%= u.attribute :confirmed? %>
|
8
9
|
<%= u.attribute :created_at, :format => :short %>
|
9
10
|
<%= u.attribute :last_sign_in_at, :if_blank => "User did not access yet"
|
@@ -109,7 +110,8 @@ show_for also supports associations.
|
|
109
110
|
|
110
111
|
<% show_for @artwork do |a| %>
|
111
112
|
<%= a.association :artist %>
|
112
|
-
<%= a.association :artist, :
|
113
|
+
<%= a.association :artist, :using => :name_with_title %>
|
114
|
+
<%= a.attribute :name_with_title, :in => :artist %>
|
113
115
|
|
114
116
|
<%= a.association :tags %>
|
115
117
|
<%= a.association :tags, :to_sentence => true %>
|
@@ -125,7 +127,7 @@ show_for also supports associations.
|
|
125
127
|
The first is a has_one or belongs_to association, which works like an attribute
|
126
128
|
to show_for, except it will retrieve the artist association and try to find a
|
127
129
|
proper method from ShowFor.association_methods to be used. You can pass
|
128
|
-
the option :
|
130
|
+
the option :using to tell (and not guess) which method from the association
|
129
131
|
to use.
|
130
132
|
|
131
133
|
:tags is a has_and_belongs_to_many association which will return a collection.
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ShowFor
|
2
|
+
module Association
|
3
|
+
def attribute(attribute_name, options={}, &block)
|
4
|
+
if association_name = options.delete(:in)
|
5
|
+
options[:using] = attribute_name
|
6
|
+
association(association_name, options, &block)
|
7
|
+
else
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def association(association_name, options={}, &block)
|
13
|
+
apply_default_options!(association_name, options)
|
14
|
+
|
15
|
+
# If a block with an iterator was given, no need to calculate the labels
|
16
|
+
# since we want the collection to be yielded. Otherwise, calculate the values.
|
17
|
+
value = if collection_block?(block)
|
18
|
+
collection_block = block
|
19
|
+
@object.send(association_name)
|
20
|
+
elsif block
|
21
|
+
block
|
22
|
+
else
|
23
|
+
association = @object.send(association_name)
|
24
|
+
values = retrieve_values_from_association(association, options)
|
25
|
+
|
26
|
+
if options.delete(:to_sentence)
|
27
|
+
values.to_sentence
|
28
|
+
elsif joiner = options.delete(:join)
|
29
|
+
values.join(joiner)
|
30
|
+
else
|
31
|
+
values
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
wrap_label_and_content(association_name, value, options, &collection_block)
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def retrieve_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
|
+
|
48
|
+
method = options.delete(:using) || ShowFor.association_methods.find { |m| sample.respond_to?(m) }
|
49
|
+
association.is_a?(Array) ? association.map(&method) : association.try(method)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ShowFor
|
2
|
+
module Attribute
|
3
|
+
def attribute(attribute_name, options={}, &block)
|
4
|
+
apply_default_options!(attribute_name, options)
|
5
|
+
collection_block, block = block, nil if collection_block?(block)
|
6
|
+
|
7
|
+
value = if block
|
8
|
+
block
|
9
|
+
elsif @object.respond_to?(:"human_#{attribute_name}")
|
10
|
+
@object.send :"human_#{attribute_name}"
|
11
|
+
else
|
12
|
+
@object.send(attribute_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
wrap_label_and_content(attribute_name, value, options, &collection_block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/show_for/builder.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
require 'show_for/attribute'
|
2
|
+
require 'show_for/association'
|
1
3
|
require 'show_for/content'
|
2
4
|
require 'show_for/label'
|
3
5
|
|
4
6
|
module ShowFor
|
5
7
|
class Builder
|
8
|
+
include ShowFor::Attribute
|
9
|
+
include ShowFor::Association
|
6
10
|
include ShowFor::Content
|
7
11
|
include ShowFor::Label
|
8
12
|
|
@@ -12,47 +16,6 @@ module ShowFor
|
|
12
16
|
@object, @template = object, template
|
13
17
|
end
|
14
18
|
|
15
|
-
def attribute(attribute_name, options={}, &block)
|
16
|
-
apply_default_options!(attribute_name, options)
|
17
|
-
collection_block, block = block, nil if collection_block?(block)
|
18
|
-
|
19
|
-
value = if block
|
20
|
-
block
|
21
|
-
elsif @object.respond_to?(:"human_#{attribute_name}")
|
22
|
-
@object.send :"human_#{attribute_name}"
|
23
|
-
else
|
24
|
-
@object.send(attribute_name)
|
25
|
-
end
|
26
|
-
|
27
|
-
wrap_label_and_content(attribute_name, value, options, &collection_block)
|
28
|
-
end
|
29
|
-
|
30
|
-
def association(association_name, options={}, &block)
|
31
|
-
apply_default_options!(association_name, options)
|
32
|
-
|
33
|
-
# If a block with an iterator was given, no need to calculate the labels
|
34
|
-
# since we want the collection to be yielded. Otherwise, calculate the values.
|
35
|
-
value = if collection_block?(block)
|
36
|
-
collection_block = block
|
37
|
-
@object.send(association_name)
|
38
|
-
elsif block
|
39
|
-
block
|
40
|
-
else
|
41
|
-
association = @object.send(association_name)
|
42
|
-
values = retrieve_values_from_association(association, options)
|
43
|
-
|
44
|
-
if options.delete(:to_sentence)
|
45
|
-
values.to_sentence
|
46
|
-
elsif joiner = options.delete(:join)
|
47
|
-
values.join(joiner)
|
48
|
-
else
|
49
|
-
values
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
wrap_label_and_content(association_name, value, options, &collection_block)
|
54
|
-
end
|
55
|
-
|
56
19
|
protected
|
57
20
|
|
58
21
|
def object_name #:nodoc:
|
@@ -89,10 +52,10 @@ module ShowFor
|
|
89
52
|
concat ? @template.concat(html) : html
|
90
53
|
end
|
91
54
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
55
|
+
# Returns true if the block is supposed to iterate through a collection,
|
56
|
+
# i.e. it has arity equals to one.
|
57
|
+
def collection_block?(block) #:nodoc:
|
58
|
+
block && block.arity == 1
|
96
59
|
end
|
97
60
|
end
|
98
61
|
end
|
data/lib/show_for/content.rb
CHANGED
@@ -42,11 +42,5 @@ module ShowFor
|
|
42
42
|
|
43
43
|
wrap_with(:collection, response, options)
|
44
44
|
end
|
45
|
-
|
46
|
-
# Returns true if the block is supposed to iterate through a collection,
|
47
|
-
# i.e. it has arity equals to one.
|
48
|
-
def collection_block?(block) #:nodoc:
|
49
|
-
block && block.arity == 1
|
50
|
-
end
|
51
45
|
end
|
52
46
|
end
|
data/lib/show_for/helper.rb
CHANGED
@@ -15,7 +15,7 @@ module ShowFor
|
|
15
15
|
html_options[:id] ||= dom_id(object)
|
16
16
|
html_options[:class] = "show_for #{dom_class(object)} #{html_options[:class]}".strip
|
17
17
|
|
18
|
-
content_tag(tag,
|
18
|
+
concat content_tag(tag, capture(ShowFor::Builder.new(object, self), &block), html_options)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/show_for/version.rb
CHANGED
data/test/builder_test.rb
CHANGED
@@ -3,27 +3,27 @@ require 'test_helper'
|
|
3
3
|
class BuilderTest < ActionView::TestCase
|
4
4
|
|
5
5
|
def with_attribute_for(object, attribute, options={}, &block)
|
6
|
-
|
6
|
+
show_for(object) do |o|
|
7
7
|
o.attribute(attribute, options, &block)
|
8
|
-
end
|
8
|
+
end
|
9
9
|
end
|
10
10
|
|
11
11
|
def with_association_for(object, association, options={}, &block)
|
12
|
-
|
12
|
+
show_for(object) do |o|
|
13
13
|
o.association(association, options, &block)
|
14
|
-
end
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def with_label_for(object, attribute, options={})
|
18
|
-
|
18
|
+
show_for(object) do |o|
|
19
19
|
o.label attribute, options
|
20
|
-
end
|
20
|
+
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def with_content_for(object, value, options={})
|
24
|
-
|
24
|
+
show_for(object) do |o|
|
25
25
|
o.content value, options
|
26
|
-
end
|
26
|
+
end
|
27
27
|
end
|
28
28
|
|
29
29
|
# WRAPPER
|
@@ -271,11 +271,22 @@ class BuilderTest < ActionView::TestCase
|
|
271
271
|
assert_select "div.show_for p.wrapper", /PlataformaTec/
|
272
272
|
end
|
273
273
|
|
274
|
-
test "show_for accepts :
|
275
|
-
with_association_for @user, :company, :
|
274
|
+
test "show_for accepts :using as option to tell how to retrieve association value" do
|
275
|
+
with_association_for @user, :company, :using => :alternate_name
|
276
276
|
assert_select "div.show_for p.wrapper", /Alternate PlataformaTec/
|
277
277
|
end
|
278
278
|
|
279
|
+
test "show_for accepts :in to tell to retrieve an attribute from association" do
|
280
|
+
with_attribute_for @user, :alternate_name, :in => :company
|
281
|
+
assert_select "div.show_for p.wrapper", /Alternate PlataformaTec/
|
282
|
+
end
|
283
|
+
|
284
|
+
test "show_for forwards all options send with :in to association" do
|
285
|
+
with_attribute_for @user, :alternate_name, :in => :tags, :to_sentence => true
|
286
|
+
assert_no_select "div.show_for p.wrapper ul.collection"
|
287
|
+
assert_select "div.show_for p.wrapper", /Alternate Tag 1, Alternate Tag 2, and Alternate Tag 3/
|
288
|
+
end
|
289
|
+
|
279
290
|
test "show_for works with has_many/has_and_belongs_to_many associations" do
|
280
291
|
with_association_for @user, :tags
|
281
292
|
assert_select "div.show_for p.wrapper ul.collection"
|
@@ -284,8 +295,8 @@ class BuilderTest < ActionView::TestCase
|
|
284
295
|
assert_select "div.show_for p.wrapper ul.collection li", "Tag 3"
|
285
296
|
end
|
286
297
|
|
287
|
-
test "show_for accepts :
|
288
|
-
with_association_for @user, :tags, :
|
298
|
+
test "show_for accepts :using as option to tell how to retrieve association values" do
|
299
|
+
with_association_for @user, :tags, :using => :alternate_name
|
289
300
|
assert_select "div.show_for p.wrapper ul.collection"
|
290
301
|
assert_select "div.show_for p.wrapper ul.collection li", "Alternate Tag 1"
|
291
302
|
assert_select "div.show_for p.wrapper ul.collection li", "Alternate Tag 2"
|
data/test/helper_test.rb
CHANGED
@@ -2,29 +2,29 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
class HelperTest < ActionView::TestCase
|
4
4
|
test "show for yields an instance of ShowFor::Builder" do
|
5
|
-
|
5
|
+
show_for(@user) do |f|
|
6
6
|
assert f.instance_of?(ShowFor::Builder)
|
7
|
-
end
|
7
|
+
end
|
8
8
|
end
|
9
9
|
|
10
10
|
test "show for should add default class to form" do
|
11
|
-
|
11
|
+
show_for(@user) do |f| end
|
12
12
|
assert_select "div.show_for"
|
13
13
|
end
|
14
14
|
|
15
15
|
test "show for should add object class name as css class to form" do
|
16
|
-
|
16
|
+
show_for(@user) do |f| end
|
17
17
|
assert_select "div.show_for.user"
|
18
18
|
end
|
19
19
|
|
20
20
|
test "show for should pass options" do
|
21
|
-
|
21
|
+
show_for(@user, :id => "my_div", :class => "common") do |f| end
|
22
22
|
assert_select "div#my_div.show_for.user.common"
|
23
23
|
end
|
24
24
|
|
25
25
|
test "show for tag should be configurable" do
|
26
26
|
swap ShowFor, :show_for_tag => :p do
|
27
|
-
|
27
|
+
show_for(@user) do |f| end
|
28
28
|
assert_select "p.show_for"
|
29
29
|
end
|
30
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: show_for
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jos\xC3\xA9 Valim"
|
@@ -27,6 +27,8 @@ files:
|
|
27
27
|
- generators/show_for_install/templates/show_for.rb
|
28
28
|
- init.rb
|
29
29
|
- lib/show_for.rb
|
30
|
+
- lib/show_for/association.rb
|
31
|
+
- lib/show_for/attribute.rb
|
30
32
|
- lib/show_for/builder.rb
|
31
33
|
- lib/show_for/content.rb
|
32
34
|
- lib/show_for/helper.rb
|