carmen-rails 1.0.0.beta2 → 1.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +25 -4
- data/lib/carmen/rails/action_view/form_helper.rb +105 -14
- data/lib/carmen/rails/version.rb +1 -1
- data/spec/carmen/action_view/helpers/form_helper_spec.rb +44 -11
- data/spec/spec_helper.rb +0 -4
- metadata +8 -8
data/README.md
CHANGED
@@ -9,7 +9,7 @@ carmen-rails is a Rails 3 plugin that supplies two new form helper methods:
|
|
9
9
|
Just add carmen-rails to your Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'carmen-rails', '1.0.0.
|
12
|
+
gem 'carmen-rails', '~> 1.0.0.beta3'
|
13
13
|
```
|
14
14
|
|
15
15
|
## Usage
|
@@ -18,14 +18,35 @@ gem 'carmen-rails', '1.0.0.pre'
|
|
18
18
|
<%= form_for(@order) do |f| %>
|
19
19
|
<div class="field">
|
20
20
|
<%= f.label :country_code %><br />
|
21
|
-
<%= f.country_select :country_code, priority: %w(US CA), prompt: 'Please select a country' %>
|
21
|
+
<%= f.country_select :country_code, {priority: %w(US CA)}, prompt: 'Please select a country' %>
|
22
22
|
</div>
|
23
23
|
<% end %>
|
24
24
|
```
|
25
25
|
|
26
|
-
|
26
|
+
## How do I only display a subset of countries/regions?
|
27
|
+
|
28
|
+
Carmen had a concept of excluded countries in the old days, where you could
|
29
|
+
specify certain countries or regions to not include in a select.
|
30
|
+
|
31
|
+
The new (and much more flexible) way to handle this is to write a helper method
|
32
|
+
that returns the subset of regions you want to provide:
|
33
|
+
|
34
|
+
``` ruby
|
35
|
+
def only_us_and_canada
|
36
|
+
Carmen::Country.all.select{|c| %w{US CA}.include?(c.code)}
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
And then in your form something like this:
|
41
|
+
|
42
|
+
``` erb
|
43
|
+
<%= f.select :country, region_options_for_select(only_us_and_canada) %>
|
44
|
+
```
|
45
|
+
|
46
|
+
More docs coming soon. In the meantime, all of the public methods in
|
47
|
+
carmen-rails [have been thoroughly TomDoc'ed](https://github.com/jim/carmen-rails/blob/master/lib/carmen/rails/action_view/form_helper.rb).
|
27
48
|
|
28
49
|
### Demo app
|
29
50
|
|
30
51
|
There is a [live demo app](http://carmen-rails-demo.herokuapp.com) that shows
|
31
|
-
carmen-rails in action.
|
52
|
+
carmen-rails in action, and includes a [step-by-step setup guide](https://github.com/jim/carmen-demo-app#readme).
|
@@ -2,28 +2,80 @@ module ActionView
|
|
2
2
|
module Helpers
|
3
3
|
module FormOptionsHelper
|
4
4
|
|
5
|
-
#
|
5
|
+
# Generate select and subregion option tags for the given object and method. A
|
6
|
+
# common use of this would be to allow users to select a state subregion within
|
7
|
+
# a given country.
|
8
|
+
#
|
9
|
+
# object - The model object to generate the select for
|
10
|
+
# method - The attribute on the object
|
11
|
+
# parent_region_or_code - An instance of Carmen::Region or a 2-character
|
12
|
+
# country code.
|
13
|
+
# options - Other options pertaining to option tag generation. See
|
14
|
+
# `region_options_for_select`.
|
15
|
+
# html_options - Options to use when generating the select tag- class,
|
16
|
+
# id, etc.
|
6
17
|
#
|
7
18
|
# Uses region_options_or_select to generate the list of option tags.
|
19
|
+
#
|
20
|
+
# Example:
|
21
|
+
#
|
22
|
+
# subregion_select(@object, :region, {priority: ['US', 'CA']}, class: 'region')
|
23
|
+
#
|
24
|
+
# Returns an `html_safe` string containing the HTML for a select element.
|
8
25
|
def subregion_select(object, method, parent_region_or_code, options={}, html_options={})
|
9
26
|
parent_region = determine_parent(parent_region_or_code)
|
10
27
|
tag = InstanceTag.new(object, method, self, options.delete(:object))
|
11
28
|
tag.to_region_select_tag(parent_region, options, html_options)
|
12
29
|
end
|
13
30
|
|
14
|
-
#
|
31
|
+
# Generate select and country option tags for the given object and method. A
|
32
|
+
# common use of this would be to allow users to select a state subregion within
|
33
|
+
# a given country.
|
34
|
+
#
|
35
|
+
# object - The model object to generate the select for
|
36
|
+
# method - The attribute on the object
|
37
|
+
# options - Other options pertaining to option tag generation. See
|
38
|
+
# `region_options_for_select`.
|
39
|
+
# html_options - Options to use when generating the select tag- class,
|
40
|
+
# id, etc.
|
15
41
|
#
|
16
42
|
# Uses region_options_or_select to generate the list of option tags.
|
17
|
-
|
18
|
-
|
43
|
+
#
|
44
|
+
# Example:
|
45
|
+
#
|
46
|
+
# country_select(@object, :region, {priority: ['US', 'CA']}, class: 'region')
|
47
|
+
#
|
48
|
+
# Returns an `html_safe` string containing the HTML for a select element.
|
49
|
+
def country_select(object, method, options={}, html_options={})
|
50
|
+
tag = InstanceTag.new(object, method, self, options.delete(:object))
|
51
|
+
tag.to_region_select_tag(Carmen::World.instance, options, html_options)
|
19
52
|
end
|
20
53
|
|
21
|
-
|
54
|
+
# Generate option tags for a collection of regions.
|
55
|
+
#
|
56
|
+
# regions - An array or Carmen::RegionCollection containing Carmen::Regions
|
57
|
+
# selected - the code of the region that should be selected
|
58
|
+
# options - The hash of options used to customize the output (default: {}):
|
59
|
+
#
|
60
|
+
# To use priority regions (which are included in a special section at the
|
61
|
+
# top of the list), provide an array of region codes at the :priority
|
62
|
+
# option:
|
63
|
+
#
|
64
|
+
# region_options_for_select(@region.subregions, 'US', priority: ['US', 'CA'])
|
65
|
+
#
|
66
|
+
# Returns an `html_safe` string containing option tags.
|
67
|
+
def region_options_for_select(regions, selected=nil, options={})
|
68
|
+
options.stringify_keys!
|
69
|
+
priority_region_codes = options['priority'] || []
|
22
70
|
region_options = ""
|
23
71
|
|
24
72
|
unless priority_region_codes.empty?
|
73
|
+
unless regions.respond_to?(:coded)
|
74
|
+
regions = Carmen::RegionCollection.new(regions)
|
75
|
+
end
|
76
|
+
|
25
77
|
priority_regions = priority_region_codes.map do |code|
|
26
|
-
region =
|
78
|
+
region = regions.coded(code)
|
27
79
|
[region.name, region.code] if region
|
28
80
|
end.compact
|
29
81
|
unless priority_regions.empty?
|
@@ -32,28 +84,57 @@ module ActionView
|
|
32
84
|
end
|
33
85
|
end
|
34
86
|
|
35
|
-
main_options =
|
87
|
+
main_options = regions.map { |r| [r.name, r.code] }
|
88
|
+
main_options.sort!{|a, b| a.first.unpack('U').to_s <=> b.first.unpack('U').to_s}
|
36
89
|
region_options += options_for_select(main_options, selected)
|
37
90
|
region_options.html_safe
|
38
91
|
end
|
39
92
|
|
40
|
-
#
|
41
|
-
#
|
93
|
+
# Generate select and country option tags with the provided name. A
|
94
|
+
# common use of this would be to allow users to select a country name
|
95
|
+
# inside a web form.
|
96
|
+
#
|
97
|
+
# name - The name attribute for the select element.
|
98
|
+
# options - Other options pertaining to option tag generation. See
|
99
|
+
# `region_options_for_select`.
|
100
|
+
# html_options - Options to use when generating the select tag- class,
|
101
|
+
# id, etc.
|
42
102
|
#
|
43
103
|
# Uses region_options_or_select to generate the list of option tags.
|
104
|
+
#
|
105
|
+
# Example:
|
106
|
+
#
|
107
|
+
# country_select_tag('country_code', {priority: ['US', 'CA']}, class: 'region')
|
108
|
+
#
|
109
|
+
# Returns an `html_safe` string containing the HTML for a select element.
|
44
110
|
def country_select_tag(name, value, options={})
|
45
111
|
subregion_select_tag(name, value, Carmen::World.instance, options)
|
46
112
|
end
|
113
|
+
|
114
|
+
# Generate select and subregion option tags for the given object and method. A
|
115
|
+
# common use of this would be to allow users to select a state subregion within
|
116
|
+
# a given country.
|
47
117
|
#
|
48
|
-
#
|
49
|
-
#
|
118
|
+
# name - The name attribute for the select element.
|
119
|
+
# parent_region_or_code - An instance of Carmen::Region or a 2-character
|
120
|
+
# country code.
|
121
|
+
# options - Other options pertaining to option tag generation. See
|
122
|
+
# `region_options_for_select`.
|
123
|
+
# html_options - Options to use when generating the select tag- class,
|
124
|
+
# id, etc.
|
50
125
|
#
|
51
126
|
# Uses region_options_or_select to generate the list of option tags.
|
52
|
-
|
127
|
+
#
|
128
|
+
# Example:
|
129
|
+
#
|
130
|
+
# subregion_select_tag('state_code', 'US', {priority: ['US', 'CA']}, class: 'region')
|
131
|
+
#
|
132
|
+
# Returns an `html_safe` string containing the HTML for a select element.
|
133
|
+
def subregion_select_tag(name, value, parent_region_or_code, options = {}, html_options = {})
|
53
134
|
options.stringify_keys!
|
54
135
|
parent_region = determine_parent(parent_region_or_code)
|
55
136
|
priority_regions = options.delete(:priority) || []
|
56
|
-
opts = region_options_for_select(parent_region, value, priority_regions)
|
137
|
+
opts = region_options_for_select(parent_region.subregions, value, :priority => priority_regions)
|
57
138
|
html_options = {"name" => name,
|
58
139
|
"id" => sanitize_to_id(name)}.update(options.stringify_keys)
|
59
140
|
content_tag(:select, opts, html_options)
|
@@ -81,17 +162,27 @@ module ActionView
|
|
81
162
|
add_default_name_and_id(html_options)
|
82
163
|
priority_regions = options[:priority] || []
|
83
164
|
value = value(object)
|
84
|
-
opts = add_options(region_options_for_select(parent_region, value, priority_regions), options, value)
|
165
|
+
opts = add_options(region_options_for_select(parent_region.subregions, value, :priority => priority_regions), options, value)
|
85
166
|
content_tag("select", opts, html_options)
|
86
167
|
end
|
87
168
|
end
|
88
169
|
|
89
170
|
class FormBuilder
|
171
|
+
# Generate select and country option tags with the provided name. A
|
172
|
+
# common use of this would be to allow users to select a country name inside a
|
173
|
+
# web form.
|
174
|
+
#
|
175
|
+
# See `FormOptionsHelper::country_select` for more information.
|
90
176
|
def country_select(method, options = {}, html_options = {})
|
91
177
|
@template.country_select(@object_name, method,
|
92
178
|
options.merge(:object => @object), html_options)
|
93
179
|
end
|
94
180
|
|
181
|
+
# Generate select and subregion option tags with the provided name. A
|
182
|
+
# common use of this would be to allow users to select a state subregion within
|
183
|
+
# a given country.
|
184
|
+
#
|
185
|
+
# See `FormOptionsHelper::subregion_select` for more information.
|
95
186
|
def subregion_select(method, parent_region_or_code, options={}, html_options={})
|
96
187
|
@template.subregion_select(@object_name, method, parent_region_or_code,
|
97
188
|
options.merge(:object => @object), html_options)
|
data/lib/carmen/rails/version.rb
CHANGED
@@ -18,9 +18,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
18
18
|
html = country_select(@object, :country_code)
|
19
19
|
expected = <<-HTML
|
20
20
|
<select id="object_country_code" name="object[country_code]">
|
21
|
-
<option value="OC">Oceania</option>
|
22
|
-
<option value="EU">Eurasia</option>
|
23
21
|
<option value="ES">Eastasia</option>
|
22
|
+
<option value="EU">Eurasia</option>
|
23
|
+
<option value="OC">Oceania</option>
|
24
24
|
</select>
|
25
25
|
HTML
|
26
26
|
|
@@ -37,9 +37,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
37
37
|
html = country_select_tag('attribute_name', nil)
|
38
38
|
expected = <<-HTML
|
39
39
|
<select id="attribute_name" name="attribute_name">
|
40
|
-
<option value="OC">Oceania</option>
|
41
|
-
<option value="EU">Eurasia</option>
|
42
40
|
<option value="ES">Eastasia</option>
|
41
|
+
<option value="EU">Eurasia</option>
|
42
|
+
<option value="OC">Oceania</option>
|
43
43
|
</select>
|
44
44
|
HTML
|
45
45
|
|
@@ -52,14 +52,14 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_priority_country_select
|
55
|
-
html = country_select(@object, :country_code, {priority
|
55
|
+
html = country_select(@object, :country_code, {:priority => ['ES']})
|
56
56
|
expected = <<-HTML
|
57
57
|
<select id="object_country_code" name="object[country_code]">
|
58
58
|
<option value="ES">Eastasia</option>
|
59
59
|
<option disabled>-------------</option>
|
60
|
-
<option value="OC">Oceania</option>
|
61
|
-
<option value="EU">Eurasia</option>
|
62
60
|
<option value="ES">Eastasia</option>
|
61
|
+
<option value="EU">Eurasia</option>
|
62
|
+
<option value="OC">Oceania</option>
|
63
63
|
</select>
|
64
64
|
HTML
|
65
65
|
|
@@ -69,7 +69,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
69
69
|
def test_basic_subregion_select
|
70
70
|
oceania = Carmen::Country.coded('OC')
|
71
71
|
expected = <<-HTML
|
72
|
-
<select id="object_subregion_code" name="object[subregion_code]"
|
72
|
+
<select id="object_subregion_code" name="object[subregion_code]">
|
73
|
+
<option value="AO">Airstrip One</option>
|
74
|
+
</select>
|
73
75
|
HTML
|
74
76
|
|
75
77
|
html = subregion_select(@object, :subregion_code, oceania)
|
@@ -79,7 +81,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
79
81
|
|
80
82
|
def test_subregion_select_using_parent_code
|
81
83
|
expected = <<-HTML
|
82
|
-
<select id="object_subregion_code" name="object[subregion_code]"
|
84
|
+
<select id="object_subregion_code" name="object[subregion_code]">
|
85
|
+
<option value="AO">Airstrip One</option>
|
86
|
+
</select>
|
83
87
|
HTML
|
84
88
|
|
85
89
|
html = subregion_select(@object, :subregion_code, 'OC')
|
@@ -89,7 +93,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
89
93
|
|
90
94
|
def test_subregion_select_using_parent_code_array
|
91
95
|
expected = <<-HTML
|
92
|
-
<select id="object_subregion_code" name="object[subregion_code]"
|
96
|
+
<select id="object_subregion_code" name="object[subregion_code]">
|
97
|
+
<option value="LO">London</option>
|
98
|
+
</select>
|
93
99
|
HTML
|
94
100
|
|
95
101
|
html = subregion_select(@object, :subregion_code, ['OC', 'AO'])
|
@@ -109,7 +115,9 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
109
115
|
def test_basic_subregion_select
|
110
116
|
oceania = Carmen::Country.coded('OC')
|
111
117
|
expected = <<-HTML
|
112
|
-
<select id="subregion_code" name="subregion_code"
|
118
|
+
<select id="subregion_code" name="subregion_code">
|
119
|
+
<option value="AO">Airstrip One</option>
|
120
|
+
</select>
|
113
121
|
HTML
|
114
122
|
|
115
123
|
html = subregion_select_tag(:subregion_code, nil, oceania)
|
@@ -117,6 +125,31 @@ class CarmenViewHelperTest < MiniTest::Unit::TestCase
|
|
117
125
|
assert_equal_markup(expected, html)
|
118
126
|
end
|
119
127
|
|
128
|
+
def test_region_options_for_select
|
129
|
+
regions = Carmen::Country.all
|
130
|
+
expected = <<-HTML
|
131
|
+
<option value="ES">Eastasia</option>
|
132
|
+
<option value="EU">Eurasia</option>
|
133
|
+
<option value="OC" selected="selected">Oceania</option>
|
134
|
+
HTML
|
135
|
+
html = region_options_for_select(regions, 'OC')
|
136
|
+
|
137
|
+
assert_equal_markup(expected, html)
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_region_options_for_select_with_array_of_regions_and_priority
|
141
|
+
regions = [Carmen::Country.coded('ES'), Carmen::Country.coded('EU')]
|
142
|
+
expected = <<-HTML
|
143
|
+
<option value="ES">Eastasia</option>
|
144
|
+
<option disabled>-------------</option>
|
145
|
+
<option value="ES">Eastasia</option>
|
146
|
+
<option value="EU">Eurasia</option>
|
147
|
+
HTML
|
148
|
+
html = region_options_for_select(regions, nil, :priority => ['ES'])
|
149
|
+
|
150
|
+
assert_equal_markup(expected, html)
|
151
|
+
end
|
152
|
+
|
120
153
|
def method_missing(method, *args)
|
121
154
|
fail "method_missing #{method}"
|
122
155
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,13 +7,9 @@ require 'minitest/autorun'
|
|
7
7
|
require 'action_view/test_case'
|
8
8
|
|
9
9
|
require 'rails'
|
10
|
-
require 'carmen'
|
11
10
|
require 'carmen-rails'
|
12
11
|
require 'ostruct'
|
13
12
|
|
14
|
-
require 'yaml'
|
15
|
-
YAML::ENGINE.yamler = 'syck'
|
16
|
-
|
17
13
|
MiniTest::Spec.register_spec_type(/.*/, ActionView::TestCase)
|
18
14
|
|
19
15
|
Carmen.clear_data_paths
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carmen-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-21 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70153544790280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70153544790280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: carmen
|
27
|
-
requirement: &
|
27
|
+
requirement: &70153544786740 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0.beta2
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70153544786740
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: minitest
|
38
|
-
requirement: &
|
38
|
+
requirement: &70153544785780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70153544785780
|
47
47
|
description: Provides country_select and subregion_select form helpers.
|
48
48
|
email:
|
49
49
|
- jim@autonomousmachine.com
|