china_regions 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42ebe2926674e82aeebf73c5111a62a20e182eda
4
+ data.tar.gz: d7ef3319973190e74f2e17d70a656db38d22a133
5
+ SHA512:
6
+ metadata.gz: 389e838506bd0821046b6879a11fe63fa8d996afb8f32c03fec9347d8aba079e48d2f3e30f4aeb4e99366e18751e717c5d82cc2cd8207c3a822c83b6dfb2cdcb
7
+ data.tar.gz: a2924b8c593fbb8a9f6044d29dc84b8b8b5d091daf3e77a1e33fbce5f490633d4dd7dc500d8a29a0146ffb573a190ed3260a1581347a79f5a87fa9e210daf420
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in lean.gemspec
4
- gemspec
3
+ # Specify your gem's dependencies in china_regions.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -59,6 +59,13 @@ bundle install
59
59
  = region_select :article, :district
60
60
 
61
61
  = f.submit class: 'btn'
62
+
63
+ 添加前缀名:
64
+
65
+ = form_for @article do |f|
66
+
67
+ = f.region_select [:province, :city, :district], :prefix => "home"
68
+ = f.region_select [:province, :city, :district], :prefix => "work"
62
69
 
63
70
 
64
71
  ## Contributing
@@ -1,6 +1,6 @@
1
1
  module ChinaRegions
2
2
  class FetchOptionsController < ::ActionController::Metal
3
-
3
+
4
4
  def index
5
5
  if params_valid?(params) and parent_klass = params[:parent_klass].classify.safe_constantize.find(params[:parent_id])
6
6
  table_name = params[:klass].tableize
@@ -15,16 +15,14 @@ module ChinaRegions
15
15
  self.response_body = [].to_json
16
16
  end
17
17
  end
18
-
19
-
20
- protected
18
+
19
+ protected
21
20
  def has_level_column?(klass_name)
22
21
  klass_name.classify.safe_constantize.try(:column_names).to_a.include?('level')
23
22
  end
24
-
23
+
25
24
  def params_valid?(params)
26
25
  params[:klass].present? and params[:parent_klass] =~ /^province|city$/i and params[:parent_id].present?
27
26
  end
28
-
29
27
  end
30
- end
28
+ end
data/app/models/city.rb CHANGED
@@ -1,9 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class City < ActiveRecord::Base
4
-
5
- attr_accessible :name, :province_id, :level, :zip_code, :name_en, :name_abbr
6
-
7
4
  belongs_to :province
8
5
  has_many :districts, dependent: :destroy
9
6
 
@@ -14,7 +11,7 @@ class City < ActiveRecord::Base
14
11
  end
15
12
 
16
13
  def siblings
17
- @siblings ||= scoped.with_province(self.province_id)
14
+ @siblings ||= where(nil).with_province(self.province_id)
18
15
  end
19
16
 
20
17
  end
@@ -1,23 +1,20 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class District < ActiveRecord::Base
4
-
5
- attr_accessible :name, :city_id, :name_en, :name_abbr
6
-
7
- belongs_to :city
4
+ belongs_to :city
8
5
 
9
- scope :with_city, ->(city) { where(city_id: city) }
6
+ scope :with_city, ->(city) { where(city_id: city) }
10
7
 
11
- def province
12
- city.province
13
- end
8
+ def province
9
+ city.province
10
+ end
11
+
12
+ def short_name
13
+ @short_name ||= name.gsub(/区|县|市|自治县/, '')
14
+ end
15
+
16
+ def siblings
17
+ @siblings ||= where(nil).with_city(self.city_id)
18
+ end
14
19
 
15
- def short_name
16
- @short_name ||= name.gsub(/区|县|市|自治县/, '')
17
- end
18
-
19
- def siblings
20
- @siblings ||= scoped.with_city(self.city_id)
21
- end
22
-
23
20
  end
@@ -1,10 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Province < ActiveRecord::Base
4
-
5
- attr_accessible :name, :name_en, :name_abbr
6
-
7
4
  has_many :cities, dependent: :destroy
8
5
  has_many :districts, through: :cities
9
-
10
- end
6
+ end
@@ -2,10 +2,10 @@
2
2
  require File.expand_path('../lib/china_regions/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Encore Shao"]
6
- gem.email = ["encore.shao@gmail.com"]
5
+ gem.authors = ["Encore Shao","Trey Springer"]
6
+ gem.email = ["encore.shao@gmail.com","dspringer@enova.com"]
7
7
  gem.description = %q{China regions Ruby on rails interface}
8
- gem.summary = %q{China regions Ruby on rails interface}
8
+ gem.summary = %q{Rails 4 version of dropdowns for all provinces, cities, and districts in China.}
9
9
  gem.homepage = "http://github.com/encoreshao"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
@@ -14,6 +14,6 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "china_regions"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = ChinaRegions::VERSION
17
-
17
+
18
18
  gem.add_dependency 'jquery-rails'
19
19
  end
data/config/routes.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  Rails.application.routes.draw do
2
- match '/china_regions/fetch_options', to: ChinaRegions::FetchOptionsController.action(:index)
3
- end
2
+ match '/china_regions/fetch_options' => ChinaRegions::FetchOptionsController.action(:index), via: [:get]
3
+ end
@@ -7,7 +7,7 @@ module ChinaRegions
7
7
  class Railtie < ::Rails::Railtie
8
8
  ActiveSupport.on_load(:action_view) do
9
9
  ::ActionView::Base.send :include, ChinaRegions::Helpers::FormHelper
10
- end
10
+ end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -3,24 +3,25 @@
3
3
  module ChinaRegions
4
4
  module Helpers
5
5
  module FormHelper
6
-
7
6
  def region_select(object, methods, options = {}, html_options = {})
8
7
  output = ''
9
8
 
10
9
  html_options[:class] ?
11
10
  (html_options[:class].prepend('region_select ')) :
12
11
  (html_options[:class] = 'region_select')
13
-
12
+
13
+ dropdown_prefix = options[:prefix].to_s + "_" || ""
14
+
14
15
  if Array === methods
15
16
  methods.each_with_index do |method, index|
16
17
  if region_klass = method.to_s.classify.safe_constantize
17
- choices = (index == 0 ? region_klass.scoped.collect {|p| [ p.name, p.id ] } : [])
18
+ choices = (index == 0 ? region_klass.where(nil).collect {|p| [ p.name, p.id ] } : [])
18
19
  next_method = methods.at(index + 1)
19
-
20
+
20
21
  set_options(method, options, region_klass)
21
- set_html_options(object, method, html_options, next_method)
22
-
23
- output << select(object, "#{method.to_s}_id", choices, options = options, html_options = html_options)
22
+ set_html_options(object, method, html_options, next_method, dropdown_prefix)
23
+
24
+ output << select(object, "#{dropdown_prefix}#{method.to_s}_id", choices, options = options, html_options = html_options)
24
25
  else
25
26
  raise "Method '#{method}' is not a vaild attribute of #{object}"
26
27
  end
@@ -37,20 +38,20 @@ module ChinaRegions
37
38
 
38
39
  if region_klass = methods.to_s.classify.safe_constantize
39
40
  options[:prompt] = region_prompt(region_klass)
40
-
41
- output << select(object, _methods, region_klass.scoped.collect {|p| [ p.name, p.id ] }, options = options, html_options = html_options)
41
+
42
+ output << select(object, _methods, region_klass.where(nil).collect {|p| [ p.name, p.id ] }, options = options, html_options = html_options)
42
43
  else
43
44
  raise "Method '#{method}' is not a vaild attribute of #{object}"
44
45
  end
45
46
  end
46
-
47
+
47
48
  output << javascript_tag(js_output)
48
49
  output.html_safe
49
50
  end
50
-
51
-
51
+
52
+
52
53
  private
53
-
54
+
54
55
  def set_options(method, options, region_klass)
55
56
  if respond_to?("#{method}_select_prompt")
56
57
  options[:prompt] = __send__("#{method}_select_prompt")
@@ -58,44 +59,49 @@ module ChinaRegions
58
59
  options[:prompt] = region_prompt(region_klass)
59
60
  end
60
61
  end
61
-
62
- def set_html_options(object, method, html_options, next_region)
62
+
63
+ def set_html_options(object, method, html_options, next_region, prefix)
63
64
  html_options[:data] ? (html_options[:data][:region_klass] = "#{method.to_s}") : (html_options[:data] = { region_klass: "#{method.to_s}" })
64
65
  if next_region
65
- html_options[:data].merge!(region_target: "#{object}_#{next_region.to_s}_id", region_target_kalss: next_region.to_s)
66
+ html_options[:data].merge!(region_target: "#{object}_#{prefix}#{next_region.to_s}_id", region_target_klass: next_region.to_s)
66
67
  else
67
68
  html_options[:data].delete(:region_target)
68
- html_options[:data].delete(:region_target_kalss)
69
+ html_options[:data].delete(:region_target_klass)
69
70
  end
70
71
  end
71
-
72
+
72
73
  def region_prompt(region_klass)
73
74
  t('views.select', model: region_klass.model_name.human)
74
75
  end
75
-
76
+
76
77
  def js_output
77
78
  %~
78
79
  $(function(){
79
80
  $('body').on('change', '.region_select', function(event) {
80
- var self, targetDom;
81
- self = $(event.currentTarget);
82
- targetDom = $('#' + self.data('region-target'));
81
+ var changedObj, targetDom;
82
+ changedObj = $(event.currentTarget);
83
+ targetDom = $('#' + changedObj.data('region-target'));
83
84
  if (targetDom.size() > 0) {
84
- $.getJSON('/china_regions/fetch_options', {klass: self.data('region-target-kalss'), parent_klass: self.data('region-klass'), parent_id: self.val()}, function(data) {
85
+ $.getJSON('/china_regions/fetch_options', {klass: changedObj.data('region-target-klass'), parent_klass: changedObj.data('region-klass'), parent_id: changedObj.val()}, function(data) {
85
86
  $('option[value!=""]', targetDom).remove();
86
87
  $.each(data, function(index, value) {
87
88
  targetDom.append("<option value='" + value.id + "'>" + value.name + "</option>");
88
89
  });
89
90
  })
91
+ // just clear out the second dropdown if it exists, they should start from the beginning
92
+ secondTargetDom = $('#' + targetDom.data('region-target'));
93
+ if (secondTargetDom.size() > 0) {
94
+ $('option[value!=""]', secondTargetDom).remove();
95
+ }
90
96
  }
91
97
  });
92
98
  });
93
99
  ~
94
100
  end
95
-
101
+
96
102
  end
97
-
98
-
103
+
104
+
99
105
  module FormBuilder
100
106
  def region_select(methods, options = {}, html_options = {})
101
107
  @template.region_select(@object_name, methods, options = options, html_options = html_options)
@@ -106,4 +112,4 @@ module ChinaRegions
106
112
  end
107
113
 
108
114
  ActionView::Base.send :include, ChinaRegions::Helpers::FormHelper
109
- ActionView::Helpers::FormBuilder.send :include, ChinaRegions::Helpers::FormBuilder
115
+ ActionView::Helpers::FormBuilder.send :include, ChinaRegions::Helpers::FormBuilder
@@ -1,3 +1,3 @@
1
1
  module ChinaRegions
2
- VERSION = "0.0.5"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -6,14 +6,14 @@ module ChinaRegions
6
6
  source_root File.expand_path('../templates', __FILE__)
7
7
 
8
8
  def copy_migration
9
- system("rm db/migrate/*_china_regions_tables.rb")
9
+ Dir["db/migrate/*_china_regions_tables.rb"].each{ |file| File.delete(file) }
10
10
  migration_template "migration.rb", "db/migrate/create_china_regions_tables.rb"
11
11
  end
12
-
12
+
13
13
  def copy_cities
14
14
  copy_file('cities.yml', 'config/cities.yml') unless File::exists?("config/cities.yml")
15
15
  end
16
-
16
+
17
17
  def copy_locales
18
18
  unless File::exists?("config/locales/regions.en.yml")
19
19
  copy_file "../../../../config/locales/en.yml", "config/locales/regions.en.yml"
@@ -23,10 +23,16 @@ module ChinaRegions
23
23
  end
24
24
  end
25
25
 
26
+ def copy_rake_tasks
27
+ unless File::exists?("lib/tasks/china_regions.rake")
28
+ copy_file "../../../../lib/tasks/china_regions.rake", "lib/tasks/china_regions.rake"
29
+ end
30
+ end
31
+
26
32
  def execute_migrate
27
33
  rake("db:migrate")
28
34
  end
29
-
35
+
30
36
  def import_cities_to_database
31
37
  rake('china_regions:import')
32
38
  end
@@ -9,12 +9,12 @@ class CreateChinaRegionsTables < ActiveRecord::Migration
9
9
  t.string :name_abbr
10
10
  t.timestamps
11
11
  end
12
-
12
+
13
13
  add_index :provinces, :name
14
14
  add_index :provinces, :name_en
15
15
  add_index :provinces, :name_abbr
16
16
  end
17
-
17
+
18
18
  unless table_exists? 'cities'
19
19
  create_table :cities do |t|
20
20
  t.string :name
@@ -32,7 +32,7 @@ class CreateChinaRegionsTables < ActiveRecord::Migration
32
32
  add_index :cities, :name_en
33
33
  add_index :cities, :name_abbr
34
34
  end
35
-
35
+
36
36
  unless table_exists? 'districts'
37
37
  create_table :districts do |t|
38
38
  t.string :name
@@ -47,4 +47,4 @@ class CreateChinaRegionsTables < ActiveRecord::Migration
47
47
  add_index :districts, :name_abbr
48
48
  end
49
49
  end
50
- end
50
+ end
@@ -8,39 +8,62 @@ namespace :china_regions do
8
8
  task :import => :environment do
9
9
  file_path = File.join(Rails.root, 'config', 'cities.yml')
10
10
  data = File.open(file_path) { |file| YAML.load(file) }
11
- remove_china_regins && load_to_db(data)
12
- puts "Data import is done."
11
+ remove_china_regions && load_to_db(data)
12
+ puts "\n China's provinces, city, region data import is complete."
13
13
  end
14
-
15
- def remove_china_regins
14
+
15
+ def remove_china_regions
16
16
  Province.delete_all && City.delete_all && District.delete_all
17
17
  end
18
18
 
19
19
  def load_to_db(data)
20
20
  data.each do |province_name, province_hash|
21
- province = Province.create({
21
+ province_parameters = province_params({
22
22
  name: province_name,
23
23
  name_en: province_hash['name_en'],
24
24
  name_abbr: province_hash['name_abbr']
25
25
  })
26
+ province = Province.create(province_parameters)
27
+
26
28
  province_hash['cities'].each do |city_name, city_hash|
27
- city = province.cities.create({
28
- name: city_name,
29
- name_en: city_hash['name_en'],
30
- name_abbr: city_hash['name_abbr'],
31
- zip_code: city_hash['zip_code'],
32
- level: city_hash['level'] || 4
29
+ city_parameters = city_params({
30
+ province_id: province.id,
31
+ name: city_name,
32
+ name_en: city_hash['name_en'],
33
+ name_abbr: city_hash['name_abbr'],
34
+ zip_code: city_hash['zip_code'],
35
+ level: city_hash['level'] || 4
33
36
  })
34
- districts_hash = city_hash['districts']
37
+ city = City.create(city_parameters)
35
38
 
39
+ districts_hash = city_hash['districts']
36
40
  districts_hash.each do |district_name, district_hash|
37
- city.districts.create({
38
- name: district_name,
39
- name_en: district_hash['name_en'],
40
- name_abbr: district_hash['name_abbr']
41
+ district_parameters = district_params({
42
+ city_id: city.id,
43
+ name: district_name,
44
+ name_en: district_hash['name_en'],
45
+ name_abbr: district_hash['name_abbr']
41
46
  })
47
+ District.create(district_parameters)
42
48
  end
43
49
  end
50
+ print "."
44
51
  end
45
52
  end
46
- end
53
+
54
+ private
55
+ def province_params(raw_parameters)
56
+ parameters = ActionController::Parameters.new(raw_parameters)
57
+ parameters.permit(:name, :name_en, :name_abbr)
58
+ end
59
+
60
+ def city_params(raw_parameters)
61
+ parameters = ActionController::Parameters.new(raw_parameters)
62
+ parameters.permit(:province_id, :name, :name_en, :name_abbr, :zip_code, :level)
63
+ end
64
+
65
+ def district_params(raw_parameters)
66
+ parameters = ActionController::Parameters.new(raw_parameters)
67
+ parameters.permit(:city_id, :name, :name_en, :name_abbr)
68
+ end
69
+ end
metadata CHANGED
@@ -1,40 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: china_regions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Encore Shao
8
+ - Trey Springer
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-13 00:00:00.000000000 Z
12
+ date: 2014-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jquery-rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
17
  requirements:
19
- - - ! '>='
18
+ - - ">="
20
19
  - !ruby/object:Gem::Version
21
20
  version: '0'
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
- - - ! '>='
25
+ - - ">="
28
26
  - !ruby/object:Gem::Version
29
27
  version: '0'
30
28
  description: China regions Ruby on rails interface
31
29
  email:
32
30
  - encore.shao@gmail.com
31
+ - dspringer@enova.com
33
32
  executables: []
34
33
  extensions: []
35
34
  extra_rdoc_files: []
36
35
  files:
37
- - .gitignore
36
+ - ".gitignore"
38
37
  - Gemfile
39
38
  - LICENSE
40
39
  - README.md
@@ -58,26 +57,26 @@ files:
58
57
  - lib/tasks/china_regions.rake
59
58
  homepage: http://github.com/encoreshao
60
59
  licenses: []
60
+ metadata: {}
61
61
  post_install_message:
62
62
  rdoc_options: []
63
63
  require_paths:
64
64
  - lib
65
65
  required_ruby_version: !ruby/object:Gem::Requirement
66
- none: false
67
66
  requirements:
68
- - - ! '>='
67
+ - - ">="
69
68
  - !ruby/object:Gem::Version
70
69
  version: '0'
71
70
  required_rubygems_version: !ruby/object:Gem::Requirement
72
- none: false
73
71
  requirements:
74
- - - ! '>='
72
+ - - ">="
75
73
  - !ruby/object:Gem::Version
76
74
  version: '0'
77
75
  requirements: []
78
76
  rubyforge_project:
79
- rubygems_version: 1.8.23
77
+ rubygems_version: 2.2.0.rc.1
80
78
  signing_key:
81
- specification_version: 3
82
- summary: China regions Ruby on rails interface
79
+ specification_version: 4
80
+ summary: Rails 4 version of dropdowns for all provinces, cities, and districts in
81
+ China.
83
82
  test_files: []