china_regions 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +88 -0
- data/Gemfile +2 -0
- data/README.md +27 -18
- data/Rakefile +3 -1
- data/app/controllers/china_regions/fetch_options_controller.rb +11 -11
- data/app/models/city.rb +2 -4
- data/app/models/district.rb +2 -4
- data/app/models/province.rb +1 -3
- data/china_regions.gemspec +15 -11
- data/config/routes.rb +2 -0
- data/lib/china_regions/engine.rb +4 -2
- data/lib/china_regions/helpers/form_helper.rb +30 -36
- data/lib/china_regions/version.rb +3 -1
- data/lib/china_regions.rb +5 -3
- data/lib/custom_tasks/china_regions.rake +88 -0
- data/lib/generators/china_regions/install_generator.rb +21 -24
- data/lib/generators/china_regions/regions_generator.rb +6 -6
- data/lib/generators/china_regions/templates/migration.rb +33 -29
- metadata +20 -7
- data/lib/tasks/china_regions.rake +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 355fcf16235b294a0555cd4e759320ee12486509cef20405672bdaaedbf958bd
|
4
|
+
data.tar.gz: 4fdcee628fb6af5057cb20771a05b5bd2f4ab13b100715473d3d567d917f4504
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a433388666d30dcf2177653ade0bd6523e5a50151d2f54b3f06d6d553f4a21df8d9ec63eb066e7bbc64694d772456868f6d5fae937d27cc805130b006f19c37f
|
7
|
+
data.tar.gz: a26988d21b27a1898b6f17ccefd2cadbb5af352cc00205294954f02afa3f01b741f76e9cd10d7fe9dd16e3d7f033fd9e964eeeb1c030c063628eb2ca5d56f267
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# This is the configuration used to check the rubocop source code.
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
DisplayCopNames: true
|
5
|
+
TargetRubyVersion: 2.5.1
|
6
|
+
Exclude:
|
7
|
+
- '**/*.yml'
|
8
|
+
- 'db/**/*'
|
9
|
+
- 'config/**/*'
|
10
|
+
- 'doc/**/*'
|
11
|
+
- 'deployment/**/*'
|
12
|
+
- 'bin/**/*'
|
13
|
+
- 'tmp/**/*'
|
14
|
+
- 'lib/china_regions/helpers/form_helper.rb'
|
15
|
+
|
16
|
+
Style/StringLiterals:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Documentation:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/RegexpLiteral:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
Layout/SpaceInsideHashLiteralBraces:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Style/FormatString:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Lint/AssignmentInCondition:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Layout/EmptyLinesAroundAccessModifier:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
Style/SingleLineBlockParams:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Style/NumericLiterals:
|
41
|
+
Exclude:
|
42
|
+
- 'spec/**/*'
|
43
|
+
|
44
|
+
Style/StringLiteralsInInterpolation:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Layout/CaseIndentation:
|
48
|
+
EnforcedStyle: end
|
49
|
+
IndentOneStep: false
|
50
|
+
|
51
|
+
Layout/EndAlignment:
|
52
|
+
EnforcedStyleAlignWith: variable
|
53
|
+
|
54
|
+
Lint/UselessAssignment:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Style/NumericLiterals:
|
58
|
+
Enabled: false
|
59
|
+
|
60
|
+
Metrics/AbcSize:
|
61
|
+
Max: 56
|
62
|
+
|
63
|
+
Metrics/CyclomaticComplexity:
|
64
|
+
Max: 10
|
65
|
+
|
66
|
+
Metrics/ModuleLength:
|
67
|
+
Max: 156
|
68
|
+
|
69
|
+
Metrics/PerceivedComplexity:
|
70
|
+
Max: 15
|
71
|
+
|
72
|
+
Metrics/LineLength:
|
73
|
+
Max: 160
|
74
|
+
|
75
|
+
Metrics/MethodLength:
|
76
|
+
Max: 24
|
77
|
+
|
78
|
+
Metrics/ClassLength:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
Metrics/ParameterLists:
|
82
|
+
Max: 10
|
83
|
+
|
84
|
+
Metrics/BlockLength:
|
85
|
+
Max: 100
|
86
|
+
|
87
|
+
Security/MarshalLoad:
|
88
|
+
Enabled: false
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,53 +1,62 @@
|
|
1
1
|
# ChinaRegions
|
2
2
|
|
3
|
-
中国省份,城市,地区[地级市]
|
4
|
-
Ruby on Rails 程式代码, Ruby ( > 1.9.x ) And Rails (> 4.0)
|
3
|
+
中国省份,城市,地区[地级市]Ruby on Rails 程式代码, Ruby (> 1.9.x) And Rails (> 4.0)
|
5
4
|
|
6
|
-
##
|
5
|
+
## 如何更新数据文件
|
7
6
|
|
8
7
|
If you are using ChinaRegions version 0.1.x be sure to run:
|
9
8
|
|
10
|
-
rails g china_regions:regions
|
9
|
+
>> rails g china_regions:regions
|
11
10
|
|
12
11
|
to have the javascript file copied over into your project.
|
13
12
|
|
14
|
-
##
|
13
|
+
## 如何引入china_regions到你的项目
|
15
14
|
|
16
15
|
添加以下代码到你的 Gemfile:
|
17
16
|
|
18
|
-
gem 'china_regions'
|
17
|
+
gem 'china_regions'
|
19
18
|
|
20
19
|
OR
|
21
20
|
|
22
|
-
gem 'china_regions', github: 'encoreshao/china_regions'
|
21
|
+
gem 'china_regions', github: 'encoreshao/china_regions'
|
23
22
|
|
24
|
-
|
23
|
+
安装:
|
25
24
|
|
26
|
-
|
25
|
+
>> bundle install
|
27
26
|
|
28
|
-
|
27
|
+
### 开始构建城市数据
|
28
|
+
|
29
|
+
复制所需文件到你的项目中:
|
30
|
+
|
31
|
+
>> rails g china_regions:install
|
29
32
|
|
30
33
|
随后你可以看到控制台发生的变化:
|
31
34
|
* 复制 db/migrate/xxxxxxxxxxx_create_china_regions_tables.rb 文件到db/migrate 目录
|
32
35
|
* 复制 数据源 cities.yml 到 config 目录. config/cities.yml
|
33
36
|
* 复制 regions.en.yml 和 regions.zh.yml 文件到 config/locales 目录
|
34
|
-
|
35
|
-
|
37
|
+
|
38
|
+
创建所需的表 (provinces, cities, districts):
|
39
|
+
|
40
|
+
>> rake db:migrate
|
41
|
+
|
42
|
+
导入数据到对应表中:
|
43
|
+
|
44
|
+
>> rake china_regions:import
|
36
45
|
|
37
46
|
|
38
|
-
|
47
|
+
将所需的模型(Models) [`Province`, `City`, `District`] 到您的应用程式中:
|
39
48
|
|
40
49
|
你可以执行 `rails g` 查看到 generator LIST.
|
41
50
|
|
42
|
-
|
51
|
+
>> rails g china_regions:regions
|
43
52
|
|
44
|
-
|
53
|
+
查看 app/models:
|
45
54
|
|
46
55
|
create app/models/province.rb
|
47
56
|
create app/models/city.rb
|
48
57
|
create app/models/district.rb
|
49
58
|
|
50
|
-
##
|
59
|
+
## 如何在View中使用
|
51
60
|
|
52
61
|
范例:
|
53
62
|
|
@@ -76,7 +85,7 @@ bundle install
|
|
76
85
|
= f.region_select [:province, :city, :district], :prefix => "work"
|
77
86
|
|
78
87
|
|
79
|
-
|
88
|
+
预选则省份:
|
80
89
|
|
81
90
|
= form_for @article do |f|
|
82
91
|
|
@@ -86,7 +95,7 @@ Preselect Province:
|
|
86
95
|
|
87
96
|
= f.region_select [:province, :city, :district], province: "重庆市"
|
88
97
|
|
89
|
-
|
98
|
+
优先选择:
|
90
99
|
|
91
100
|
= form_for @article do |f|
|
92
101
|
|
data/Rakefile
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ChinaRegions
|
4
4
|
class FetchOptionsController < ::ActionController::Metal
|
5
|
-
|
6
5
|
def index
|
7
|
-
if params_valid?(params)
|
6
|
+
if params_valid?(params) && (parent_klass = params[:parent_klass].classify.safe_constantize.find(params[:parent_id]))
|
8
7
|
table_name = params[:klass].tableize
|
9
8
|
regions = parent_klass.__send__(table_name).select("#{table_name}.id, #{table_name}.name")
|
10
|
-
if
|
11
|
-
regions
|
9
|
+
regions = if level_column?(params[:klass])
|
10
|
+
regions.order('level ASC')
|
12
11
|
else
|
13
|
-
regions
|
12
|
+
regions.order('name ASC')
|
14
13
|
end
|
15
|
-
self.response_body = regions.to_json
|
16
14
|
else
|
17
|
-
|
15
|
+
regions = []
|
18
16
|
end
|
17
|
+
|
18
|
+
self.response_body = regions.to_json
|
19
19
|
end
|
20
20
|
|
21
21
|
protected
|
22
|
-
|
22
|
+
|
23
|
+
def level_column?(klass_name)
|
23
24
|
klass_name.classify.safe_constantize.try(:column_names).to_a.include?('level')
|
24
25
|
end
|
25
26
|
|
26
27
|
def params_valid?(params)
|
27
|
-
params[:klass].present?
|
28
|
+
params[:klass].present? && params[:parent_klass] =~ /^province|city$/i && params[:parent_id].present?
|
28
29
|
end
|
29
|
-
|
30
30
|
end
|
31
31
|
end
|
data/app/models/city.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class City < ActiveRecord::Base
|
4
|
-
|
5
4
|
belongs_to :province
|
6
5
|
has_many :districts, dependent: :destroy
|
7
6
|
|
@@ -12,7 +11,6 @@ class City < ActiveRecord::Base
|
|
12
11
|
end
|
13
12
|
|
14
13
|
def siblings
|
15
|
-
@siblings ||= where(nil).with_province(
|
14
|
+
@siblings ||= where(nil).with_province(province_id)
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
data/app/models/district.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class District < ActiveRecord::Base
|
4
|
-
|
5
4
|
belongs_to :city
|
6
5
|
|
7
6
|
scope :with_city, ->(city) { where(city_id: city) }
|
@@ -15,7 +14,6 @@ class District < ActiveRecord::Base
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def siblings
|
18
|
-
@siblings ||= where(nil).with_city(
|
17
|
+
@siblings ||= where(nil).with_city(city_id)
|
19
18
|
end
|
20
|
-
|
21
19
|
end
|
data/app/models/province.rb
CHANGED
data/china_regions.gemspec
CHANGED
@@ -1,19 +1,23 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require File.expand_path('lib/china_regions/version', __dir__)
|
3
5
|
|
4
6
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
7
|
-
gem.description =
|
8
|
-
gem.summary =
|
9
|
-
|
7
|
+
gem.authors = ['Encore Shao']
|
8
|
+
gem.email = ['encore.shao@gmail.com']
|
9
|
+
gem.description = 'China regions Ruby on rails interface'
|
10
|
+
gem.summary = 'Rails 4 version of dropdowns for all provinces, cities,
|
11
|
+
and districts in China.'
|
12
|
+
gem.homepage = 'http://github.com/encoreshao'
|
10
13
|
|
11
|
-
gem.files = `git ls-files`.split(
|
12
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
13
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
17
|
+
gem.name = 'china_regions'
|
18
|
+
gem.require_paths = ['lib']
|
16
19
|
gem.version = ChinaRegions::VERSION
|
17
20
|
|
18
21
|
gem.add_dependency 'jquery-rails'
|
22
|
+
gem.add_development_dependency 'rubocop'
|
19
23
|
end
|
data/config/routes.rb
CHANGED
data/lib/china_regions/engine.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
module ChinaRegions
|
3
5
|
module Helpers
|
4
6
|
module FormHelper
|
5
7
|
def region_select(object_name, methods, options = {}, html_options = {})
|
6
8
|
output = ''
|
7
9
|
|
8
|
-
preselected_choices =
|
10
|
+
preselected_choices = setup_regions_options(options)
|
9
11
|
|
10
12
|
html_options[:class] ?
|
11
|
-
|
13
|
+
html_options[:class].prepend('region_select ') :
|
12
14
|
(html_options[:class] = 'region_select')
|
13
15
|
|
14
|
-
dropdown_prefix = options[:prefix] ? options[:prefix].to_s +
|
16
|
+
dropdown_prefix = options[:prefix] ? options[:prefix].to_s + '_' : ''
|
15
17
|
|
16
|
-
if Array
|
18
|
+
if Array == methods
|
17
19
|
methods.each_with_index do |method, index|
|
18
20
|
if region_klass = method.to_s.classify.safe_constantize
|
19
|
-
choices =
|
21
|
+
choices = fetch_choices(region_klass, method, preselected_choices, index)
|
20
22
|
choices = prioritize_choices(options[:priority][method], choices) if options[:priority].try(:[], method)
|
21
23
|
|
22
24
|
next_method = methods.at(index + 1)
|
@@ -28,28 +30,26 @@ module ChinaRegions
|
|
28
30
|
options[:selected] = options[:default][method] if options[:default][method]
|
29
31
|
end
|
30
32
|
|
31
|
-
output << select(object_name, "#{dropdown_prefix}#{method
|
33
|
+
output << select(object_name, "#{dropdown_prefix}#{method}_id", choices, options, html_options)
|
32
34
|
else
|
33
35
|
raise "Method '#{method}' is not a vaild attribute of #{object_name}"
|
34
36
|
end
|
35
37
|
end
|
36
38
|
else
|
37
|
-
|
38
|
-
|
39
|
-
else
|
40
|
-
_methods = methods
|
39
|
+
inner_methods = if methods.to_s.include?('_id')
|
40
|
+
inner_methods = methods
|
41
41
|
methods = methods.to_s.gsub(/(_id)$/, '')
|
42
|
-
|
42
|
+
inner_methods
|
43
|
+
else
|
44
|
+
(methods.to_s + '_id').to_sym
|
43
45
|
end
|
44
46
|
|
45
47
|
if region_klass = methods.to_s.classify.safe_constantize
|
46
48
|
options[:prompt] = region_prompt(region_klass)
|
47
49
|
|
48
|
-
if methods == :province && preselected_choices[:province_id]
|
49
|
-
options[:selected] = preselected_choices[:province_id]
|
50
|
-
end
|
50
|
+
options[:selected] = preselected_choices[:province_id] if methods == :province && preselected_choices[:province_id]
|
51
51
|
|
52
|
-
output << select(object_name,
|
52
|
+
output << select(object_name, inner_methods, region_klass.where(nil).collect { |p| [p.name, p.id] }, options = options, html_options = html_options)
|
53
53
|
else
|
54
54
|
raise "Method '#{method}' is not a vaild attribute of #{object_name}"
|
55
55
|
end
|
@@ -58,15 +58,11 @@ module ChinaRegions
|
|
58
58
|
end
|
59
59
|
|
60
60
|
private
|
61
|
-
|
62
|
-
def get_choices(region_klass, method, preselected_choices, index)
|
61
|
+
def fetch_choices(region_klass, method, preselected_choices, index)
|
63
62
|
return preselected_choices[method] if preselected_choices[method]
|
63
|
+
return [] unless index.zero?
|
64
64
|
|
65
|
-
|
66
|
-
region_klass.where(nil).collect { |p| [p.name, p.id] }
|
67
|
-
else
|
68
|
-
[]
|
69
|
-
end
|
65
|
+
region_klass.where(nil).collect { |p| [p.name, p.id] }
|
70
66
|
end
|
71
67
|
|
72
68
|
def prioritize_choices(priorities, choices)
|
@@ -90,27 +86,26 @@ module ChinaRegions
|
|
90
86
|
priority_choices.compact + temp_choices
|
91
87
|
end
|
92
88
|
|
93
|
-
def
|
89
|
+
def setup_regions_options(options)
|
94
90
|
return {} unless options[:default] && options[:default][:province]
|
95
91
|
|
96
|
-
#TODO: Add validator to check if the passed province, city or district exists within the models
|
97
|
-
|
92
|
+
# TODO: Add validator to check if the passed province, city or district exists within the models
|
98
93
|
province_id = get_province_id(options[:default][:province])
|
99
94
|
cities = City.where(province_id: province_id)
|
100
95
|
districts = District.where(city_id: cities)
|
101
96
|
|
102
97
|
{
|
103
98
|
province_id: province_id,
|
104
|
-
city: cities.collect { |c| [
|
105
|
-
district: districts.collect { |d| [
|
99
|
+
city: cities.collect { |c| [c.name, c.id] },
|
100
|
+
district: districts.collect { |d| [d.name, d.id] }
|
106
101
|
}
|
107
102
|
end
|
108
103
|
|
109
104
|
def set_prompt(method, options, region_klass)
|
110
|
-
if respond_to?("#{method}_select_prompt")
|
111
|
-
|
105
|
+
options[:prompt] = if respond_to?("#{method}_select_prompt")
|
106
|
+
__send__("#{method}_select_prompt")
|
112
107
|
else
|
113
|
-
|
108
|
+
region_prompt(region_klass)
|
114
109
|
end
|
115
110
|
end
|
116
111
|
|
@@ -120,11 +115,11 @@ module ChinaRegions
|
|
120
115
|
end
|
121
116
|
|
122
117
|
def set_html_options(object_name, method, html_options, next_region, prefix)
|
123
|
-
html_options[:data] ? (html_options[:data][:region_klass] =
|
118
|
+
html_options[:data] ? (html_options[:data][:region_klass] = method.to_s) : (html_options[:data] = { region_klass: method.to_s })
|
124
119
|
if next_region
|
125
|
-
object_name = object_name.dup.
|
126
|
-
object_name = object_name.dup.
|
127
|
-
html_options[:data].merge!(region_target: "#{object_name}_#{prefix}#{next_region
|
120
|
+
object_name = object_name.dup.tr('[', '_')
|
121
|
+
object_name = object_name.dup.delete(']')
|
122
|
+
html_options[:data].merge!(region_target: "#{object_name}_#{prefix}#{next_region}_id", region_target_klass: next_region.to_s)
|
128
123
|
else
|
129
124
|
html_options[:data].delete(:region_target)
|
130
125
|
html_options[:data].delete(:region_target_klass)
|
@@ -141,7 +136,6 @@ module ChinaRegions
|
|
141
136
|
@template.region_select(@object_name.to_s, methods, options = options, html_options = html_options)
|
142
137
|
end
|
143
138
|
end
|
144
|
-
|
145
139
|
end
|
146
140
|
end
|
147
141
|
|
data/lib/china_regions.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'china_regions/version'
|
2
4
|
require 'china_regions/engine' if defined? Rails
|
3
|
-
require
|
5
|
+
require 'china_regions/helpers/form_helper'
|
4
6
|
|
5
|
-
module ChinaRegions;end
|
7
|
+
module ChinaRegions; end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
namespace :china_regions do
|
6
|
+
desc 'Import regions to database from config/cities.yml'
|
7
|
+
task import: :environment do
|
8
|
+
file_path = File.join(Rails.root, 'config', 'cities.yml')
|
9
|
+
data = File.open(file_path) { |file| YAML.safe_load(file) }
|
10
|
+
remove_china_regions && load_to_db(data)
|
11
|
+
|
12
|
+
puts "\n China's provinces, city, region data import is complete."
|
13
|
+
end
|
14
|
+
|
15
|
+
def remove_china_regions
|
16
|
+
Province.delete_all && City.delete_all && District.delete_all
|
17
|
+
end
|
18
|
+
|
19
|
+
def load_to_db(data)
|
20
|
+
data.each do |province_name, province_hash|
|
21
|
+
province = creating_province(province_name, province_hash)
|
22
|
+
|
23
|
+
province_hash['cities'].each do |city_name, city_hash|
|
24
|
+
city = creating_city(province.id, city_name, city_hash)
|
25
|
+
|
26
|
+
creating_districts(city.id, city_hash)
|
27
|
+
end
|
28
|
+
print '.'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def creating_province(province_name, province_hash)
|
33
|
+
province_parameters = province_params(
|
34
|
+
name: province_name,
|
35
|
+
name_en: province_hash['name_en'],
|
36
|
+
name_abbr: province_hash['name_abbr']
|
37
|
+
)
|
38
|
+
|
39
|
+
Province.create(province_parameters)
|
40
|
+
end
|
41
|
+
|
42
|
+
def creating_city(province_id, city_name, city_hash)
|
43
|
+
city_parameters = city_params(
|
44
|
+
province_id: province_id,
|
45
|
+
name: city_name,
|
46
|
+
name_en: city_hash['name_en'],
|
47
|
+
name_abbr: city_hash['name_abbr'],
|
48
|
+
zip_code: city_hash['zip_code'],
|
49
|
+
level: city_hash['level'] || 4
|
50
|
+
)
|
51
|
+
|
52
|
+
City.create(city_parameters)
|
53
|
+
end
|
54
|
+
|
55
|
+
def creating_districts(city_id, city_hash)
|
56
|
+
districts_hash = city_hash['districts']
|
57
|
+
|
58
|
+
districts_hash.each do |district_name, district_hash|
|
59
|
+
creating_district(city_id, district_name, district_hash)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def creating_district(city_id, district_name, district_hash)
|
64
|
+
district_parameters = district_params(
|
65
|
+
city_id: city_id,
|
66
|
+
name: district_name,
|
67
|
+
name_en: district_hash['name_en'],
|
68
|
+
name_abbr: district_hash['name_abbr']
|
69
|
+
)
|
70
|
+
District.create(district_parameters)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
def province_params(raw_parameters)
|
75
|
+
parameters = ActionController::Parameters.new(raw_parameters)
|
76
|
+
parameters.permit(:name, :name_en, :name_abbr)
|
77
|
+
end
|
78
|
+
|
79
|
+
def city_params(raw_parameters)
|
80
|
+
parameters = ActionController::Parameters.new(raw_parameters)
|
81
|
+
parameters.permit(:province_id, :name, :name_en, :name_abbr, :zip_code, :level)
|
82
|
+
end
|
83
|
+
|
84
|
+
def district_params(raw_parameters)
|
85
|
+
parameters = ActionController::Parameters.new(raw_parameters)
|
86
|
+
parameters.permit(:city_id, :name, :name_en, :name_abbr)
|
87
|
+
end
|
88
|
+
end
|
@@ -1,49 +1,46 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ChinaRegions
|
4
4
|
class InstallGenerator < Rails::Generators::Base
|
5
5
|
include Rails::Generators::Migration
|
6
|
-
source_root File.expand_path('
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
7
|
|
8
8
|
def copy_migration
|
9
|
-
Dir[
|
9
|
+
Dir['db/migrate/*_china_regions_tables.rb'].each { |file| File.delete(file) }
|
10
10
|
|
11
|
-
migration_template
|
11
|
+
migration_template 'migration.rb', 'db/migrate/create_china_regions_tables.rb'
|
12
12
|
end
|
13
13
|
|
14
14
|
def copy_cities
|
15
|
-
copy_file('cities.yml', 'config/cities.yml') unless File
|
15
|
+
copy_file('cities.yml', 'config/cities.yml') unless File.exist?('config/cities.yml')
|
16
16
|
end
|
17
17
|
|
18
18
|
def copy_locales
|
19
|
-
unless File
|
20
|
-
|
21
|
-
end
|
22
|
-
unless File::exists?("config/locales/regions.zh.yml")
|
23
|
-
copy_file "../../../../config/locales/zh.yml", "config/locales/regions.zh.yml"
|
24
|
-
end
|
19
|
+
copy_file '../../../../config/locales/en.yml', 'config/locales/regions.en.yml' unless File.exist?('config/locales/regions.en.yml')
|
20
|
+
copy_file '../../../../config/locales/zh.yml', 'config/locales/regions.zh.yml' unless File.exist?('config/locales/regions.zh.yml')
|
25
21
|
end
|
26
22
|
|
27
23
|
def copy_rake_tasks
|
28
|
-
unless File
|
29
|
-
copy_file "../../../../lib/tasks/china_regions.rake", "lib/tasks/china_regions.rake"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def execute_migrate
|
34
|
-
rake("db:migrate")
|
35
|
-
end
|
36
|
-
|
37
|
-
def import_cities_to_database
|
38
|
-
rake('china_regions:import')
|
24
|
+
copy_file '../../../../lib/custom_tasks/china_regions.rake', 'lib/tasks/china_regions.rake' unless File.exist?('lib/tasks/china_regions.rake')
|
39
25
|
end
|
40
26
|
|
41
27
|
def self.next_migration_number(dirname)
|
42
28
|
if ActiveRecord::Base.timestamped_migrations
|
43
|
-
Time.now.utc.strftime(
|
29
|
+
Time.now.utc.strftime('%Y%m%d%H%M%S')
|
44
30
|
else
|
45
|
-
|
31
|
+
format('%.3d', (current_migration_number(dirname) + 1))
|
46
32
|
end
|
47
33
|
end
|
34
|
+
|
35
|
+
def add_rails_version_for_migration
|
36
|
+
rails_version = Gem.loaded_specs["activesupport"].version
|
37
|
+
return if rails_version < Gem::Version.create('4.0')
|
38
|
+
|
39
|
+
migration_version = rails_version.to_s.split(/\./)[0..1].join('.')
|
40
|
+
filename = 'db/migrate/*create_china_regions_tables.rb'
|
41
|
+
kclass = 'ActiveRecord::Migration'
|
42
|
+
|
43
|
+
system(`grep -rl "#{kclass}$" #{filename} | xargs sed -i "" "s/#{kclass}/#{kclass}[#{migration_version}]/g"`)
|
44
|
+
end
|
48
45
|
end
|
49
46
|
end
|
@@ -1,17 +1,17 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ChinaRegions
|
4
4
|
class RegionsGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path('
|
5
|
+
source_root File.expand_path('../../../app', __dir__)
|
6
6
|
|
7
7
|
def copy_models_file
|
8
|
-
copy_file
|
9
|
-
copy_file
|
10
|
-
copy_file
|
8
|
+
copy_file 'models/province.rb', 'app/models/province.rb'
|
9
|
+
copy_file 'models/city.rb', 'app/models/city.rb'
|
10
|
+
copy_file 'models/district.rb', 'app/models/district.rb'
|
11
11
|
end
|
12
12
|
|
13
13
|
def copy_js_file
|
14
|
-
copy_file
|
14
|
+
copy_file 'assets/javascripts/region_select.js', 'app/assets/javascripts/region_select.js'
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -1,44 +1,48 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class CreateChinaRegionsTables < ActiveRecord::Migration
|
4
4
|
def change
|
5
|
-
unless table_exists? 'provinces'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
t.string :name_abbr
|
5
|
+
setup_provinces unless table_exists? 'provinces'
|
6
|
+
setup_citites unless table_exists? 'cities'
|
7
|
+
setup_districts unless table_exists? 'districts'
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
def setup_provinces
|
11
|
+
create_table :provinces do |t|
|
12
|
+
t.string :name
|
13
|
+
t.string :name_en
|
14
|
+
t.string :name_abbr
|
13
15
|
|
14
|
-
|
16
|
+
t.timestamps
|
15
17
|
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
t.string :name
|
20
|
-
t.integer :province_id
|
21
|
-
t.integer :level
|
22
|
-
t.string :zip_code
|
23
|
-
t.string :name_en
|
24
|
-
t.string :name_abbr
|
19
|
+
add_index :provinces, :name
|
20
|
+
end
|
25
21
|
|
26
|
-
|
27
|
-
|
22
|
+
def setup_citites
|
23
|
+
create_table :cities do |t|
|
24
|
+
t.string :name
|
25
|
+
t.integer :province_id
|
26
|
+
t.integer :level
|
27
|
+
t.string :zip_code
|
28
|
+
t.string :name_en
|
29
|
+
t.string :name_abbr
|
28
30
|
|
29
|
-
|
31
|
+
t.timestamps
|
30
32
|
end
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
add_index :cities, :name
|
35
|
+
end
|
36
|
+
|
37
|
+
def setup_districts
|
38
|
+
create_table :districts do |t|
|
39
|
+
t.string :name
|
40
|
+
t.integer :city_id
|
41
|
+
t.string :name_en
|
42
|
+
t.string :name_abbr
|
38
43
|
|
39
|
-
|
40
|
-
end
|
41
|
-
add_index :districts, :name
|
44
|
+
t.timestamps
|
42
45
|
end
|
46
|
+
add_index :districts, :name
|
43
47
|
end
|
44
48
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: china_regions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Encore Shao
|
8
|
-
- Trey Springer
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: jquery-rails
|
@@ -25,15 +24,29 @@ dependencies:
|
|
25
24
|
- - ">="
|
26
25
|
- !ruby/object:Gem::Version
|
27
26
|
version: '0'
|
28
|
-
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: China regions Ruby on rails interface
|
29
42
|
email:
|
30
43
|
- encore.shao@gmail.com
|
31
|
-
- dspringer@enova.com
|
32
44
|
executables: []
|
33
45
|
extensions: []
|
34
46
|
extra_rdoc_files: []
|
35
47
|
files:
|
36
48
|
- ".gitignore"
|
49
|
+
- ".rubocop.yml"
|
37
50
|
- Gemfile
|
38
51
|
- LICENSE
|
39
52
|
- README.md
|
@@ -51,11 +64,11 @@ files:
|
|
51
64
|
- lib/china_regions/engine.rb
|
52
65
|
- lib/china_regions/helpers/form_helper.rb
|
53
66
|
- lib/china_regions/version.rb
|
67
|
+
- lib/custom_tasks/china_regions.rake
|
54
68
|
- lib/generators/china_regions/install_generator.rb
|
55
69
|
- lib/generators/china_regions/regions_generator.rb
|
56
70
|
- lib/generators/china_regions/templates/cities.yml
|
57
71
|
- lib/generators/china_regions/templates/migration.rb
|
58
|
-
- lib/tasks/china_regions.rake
|
59
72
|
homepage: http://github.com/encoreshao
|
60
73
|
licenses: []
|
61
74
|
metadata: {}
|
@@ -75,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
88
|
version: '0'
|
76
89
|
requirements: []
|
77
90
|
rubyforge_project:
|
78
|
-
rubygems_version: 2.
|
91
|
+
rubygems_version: 2.7.6
|
79
92
|
signing_key:
|
80
93
|
specification_version: 4
|
81
94
|
summary: Rails 4 version of dropdowns for all provinces, cities, and districts in
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
namespace :china_regions do
|
6
|
-
desc "Import regions to database from config/cities.yml"
|
7
|
-
|
8
|
-
task :import => :environment do
|
9
|
-
file_path = File.join(Rails.root, 'config', 'cities.yml')
|
10
|
-
data = File.open(file_path) { |file| YAML.load(file) }
|
11
|
-
remove_china_regions && load_to_db(data)
|
12
|
-
|
13
|
-
puts "\n China's provinces, city, region data import is complete."
|
14
|
-
end
|
15
|
-
|
16
|
-
def remove_china_regions
|
17
|
-
Province.delete_all && City.delete_all && District.delete_all
|
18
|
-
end
|
19
|
-
|
20
|
-
def load_to_db(data)
|
21
|
-
data.each do |province_name, province_hash|
|
22
|
-
province_parameters = province_params({
|
23
|
-
name: province_name,
|
24
|
-
name_en: province_hash['name_en'],
|
25
|
-
name_abbr: province_hash['name_abbr']
|
26
|
-
})
|
27
|
-
province = Province.create(province_parameters)
|
28
|
-
|
29
|
-
province_hash['cities'].each do |city_name, city_hash|
|
30
|
-
city_parameters = city_params({
|
31
|
-
province_id: province.id,
|
32
|
-
name: city_name,
|
33
|
-
name_en: city_hash['name_en'],
|
34
|
-
name_abbr: city_hash['name_abbr'],
|
35
|
-
zip_code: city_hash['zip_code'],
|
36
|
-
level: city_hash['level'] || 4
|
37
|
-
})
|
38
|
-
city = City.create(city_parameters)
|
39
|
-
|
40
|
-
districts_hash = city_hash['districts']
|
41
|
-
districts_hash.each do |district_name, district_hash|
|
42
|
-
district_parameters = district_params({
|
43
|
-
city_id: city.id,
|
44
|
-
name: district_name,
|
45
|
-
name_en: district_hash['name_en'],
|
46
|
-
name_abbr: district_hash['name_abbr']
|
47
|
-
})
|
48
|
-
District.create(district_parameters)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
print "."
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def province_params(raw_parameters)
|
57
|
-
parameters = ActionController::Parameters.new(raw_parameters)
|
58
|
-
parameters.permit(:name, :name_en, :name_abbr)
|
59
|
-
end
|
60
|
-
|
61
|
-
def city_params(raw_parameters)
|
62
|
-
parameters = ActionController::Parameters.new(raw_parameters)
|
63
|
-
parameters.permit(:province_id, :name, :name_en, :name_abbr, :zip_code, :level)
|
64
|
-
end
|
65
|
-
|
66
|
-
def district_params(raw_parameters)
|
67
|
-
parameters = ActionController::Parameters.new(raw_parameters)
|
68
|
-
parameters.permit(:city_id, :name, :name_en, :name_abbr)
|
69
|
-
end
|
70
|
-
end
|