开源项目 china_city - 中国省市区级联选择插件

saberma · 发布于 2013年8月31日 · 最后由 rebecca9201 回复于 2017年3月06日 · 18447 次阅读
216
本帖已被设为精华帖!

https://github.com/saberma/china_city

简介

这是一个基于 Rails Engine 开发的插件,为 Rails 项目增加省市区三级(或者省市二级)选择框,可用于实现收货地址等信息的录入。

安装

Gemfile gem 'china_city'

app/assets/javascripts/application.js //= require 'jquery' //= require 'china_city/jquery.china_city'

config/routes.rb mount ChinaCity::Engine => '/china_city'

使用

在页面中加入选择框,示例代码使用 slim 格式

.city-group
  select.city-select
    option --省份--
    = options_for_select(ChinaCity.list)
  select.city-select
    option --城市--
  select.city-select
    option --地区--
共收到 60 条回复
3472

cool,这得省多少时间啊

2

能和数据库关联不?

2019

good, 最近刚好要用这个

216

@huacnlee 省市区的数据是从一个大的 json 获取的,不从数据库中取。

3253

#4楼 @saberma 既然是从 json 格式文件获取的,那自然可以很轻松地切换到远程 json 文件吧?

4584

果断mark下

1249

nice ! 代码也很great . 特别是用Engine来实现,完全低耦合,也可以和其他框架集成。

200

👍

  • 兼容select2吗?

建议: 感觉区域级联的应该交给js来处理, 如果一定要用rails的话可以只给个task任务导出当前的省市区固定的json格式的文件

比如: https://code.google.com/p/tex-website/source/browse/trunk/Web/Js/LinkageSelect.js?spec=svn6&r=6

96

太cool了

2973

实用。。

6110

哈哈,有木有china_college china_viewspot 。。。。

1924

好定西。

4755

cool

96

id不是邮编的啊

2116

同楼上 obinn 问题 :

  1. id用邮编
  2. 省市区的数据如何更新,即与最新的行政区划同步呢?
216

@Ddl1st 现在还没有试过与 select2 一定使用。

@otinn @afly 我记得区划编码是有自己的国家标准,而不是使用邮编。 会不一定期同步更新。

1107

加上form_helper就更易用了,我曾经粗糙的写过一个

折腾完rubyconf的事情给移植过去

1107

#8楼 @Ddl1st 需要select2支持的话推荐 https://github.com/Kehao/district_cn_selector 这个项目,不过略重,作者对ux的需求很高

15

#17楼 @saberma 行政区域编码有国标 https://github.com/huobazi/GB2260 精确到区县一级数据不多,但到村、街道办大概 要 80 多万条数据

332

非常棒!这个做电商系统都会用到,每个人都实现一套确实很无聊,感谢分享。

3930

如果根据地址直接推荐出省事就更爽了

4832

只支持Rails4?

5106

给力,顶一个。

239

几年前也做了一个纯jquery插件 https://github.com/hlxwell/jquery-cityselector

611

Good 收藏

7590

很不错!必须赞一个!

744

呃。。。rails3用不了,只能rails4了?

1107

#28楼 @Levan 现在看咱一年前的代码...那时年少懵懂啊...

744

@jasl ......

96

早知道我就不自己找数据,然后自己弄了么。。。

216

@frank @Levan 现在是没有在 rails3 下测试,有需要的话我再加入 rails3 的支持。

216

@jasl ShopQi 已经开发过这个功能,我准备拿来用的时候,觉得还是写成 engine 好点。代码几乎没怎么改,其实还有很多优化的空间。

744

真心有需要…要不就只能升级到rails4了…工程浩大…

4832

#33楼 @saberma 在Rails3下没法用。最终只能放弃。

1107

#36楼 @frank #35楼 @Levan 你们不看咱 #29楼 的代码哇...虽然没搞成gem rails3的话 咱 #19楼 推荐过一个,用的和@saberma 一样的数据源,不过作者不太遵从rails的哲学,但是功能上是足够了

216

@Levan @frank @jasl 已经同时支持 Rails3.1, 3.2 和 4.0 了

744

@jasl 看了~

744

@saberma thx~

96

太帅了~

96

看了一下 json 没看出来树形关系,原来是用作 id 的邮编是含有关系信息的~

不过感觉要是能配置匹配数据库里的数据就更好啦。

8322

@saberma 我是新手,我想问问,存入数据库的值是一串数,那读取显示在页面的时候,怎样才能再把数串转为汉字呢?

8322

@saberma 我是新手,我想问问,存入数据库的值是一串数,那读取显示在页面的时候,怎样才能再把数串转为汉字呢?

96

怒赞

1107

#42楼 @loddit 这个似乎是国标码

1107

#43楼 @gechentuo 其实你可以尝试写一个acts_as_china_city的小东西出来,非常简单,同时练习的元编程

1107

@saberma 话说,如果第一级省市是北京的话,那么第二级市 就是 市辖区和县 选择 这个我和李路的讨论结果是不太友好, 你怎么看?

8322

#47楼 @jasl 我很想写,但是不太明白你的意思。你能具体给我说说acts_as_china_city这个东西是什么吗?action?

1107

#49楼 @gechentuo 看readme

选择后的值为国家地区编码,如深圳市的为 440300,可通过调用 ChinaCity.get('440300') 将编码转化为城市名称。

所以,你可以通过形如 ChinaCity.get(user.district) 方式去将地区码转化成可读取的形式,通常我们也可以将它封装成helper,如

def humanize_district(code)
    ChinaCity.get code
end

那么,能不能将 @user.dictrict 直接变成可读取的文本呢?这个就是acts_as_的作用啦,你可以想想怎么实现他,目标是

class User
   acts_as_china_city :district
end

@user.district = '110000'
puts @user.district # => 北京市
1107

#49楼 @gechentuo 你可以先想,想不出来给你一个参考实现,哈哈

8322

#50楼 @jasl 还是给我看看你的参考吧。我不太懂 我只知道 你的代码中acts_as_china_city 的位置,一般是rails给的函数,validates之类的。我不知道怎么让自己的函数也能在model中用

4832

#38楼 @saberma 请问form_for下如何使用?

6829

LZ是不是该更新下了啊! 我怎么找不到成都高新区呢

96

能给个form_for的用法吗,为什么我加了以后不能联动.只能选择省份不能选择城市.急待解决呀!!!!!!

96

#56楼 @hqjjsw520 算是bug吧。跟踪了下,是返回的对象中还有一个data包着数据在。所以取不到值。需要hack一下。另外,重复请求也是个问题。

96

不知道楼主还在不在线,现在github上面有4个pull request等待处理。

2099

楼主,省市区的数据你是从哪里获取的?我查看了一下国家统计局的数据,发现你的编码将后面的街道给去掉了。 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/index.html

28534
4832frank 回复

我用的是simple_form,可work

<%= simple_form_for [:account,@user] do |f| %>
 <div class="city-group">
      <%= f.select :province,  ChinaCity.list.unshift(["--省份--", 0]), {}, class: "city-select"%>
      <%= f.select :city, ChinaCity.list(f.object.province).presence || [["--城市--", 0]], {}, class: "city-select" %>
      <%= f.select :area, ChinaCity.list(f.object.city).presence || [["--地区--", 0]], {}, class: "city-select" %>
</div>
<%= f.submit "更新资料", class: "btn btn-default" %>
<% end %>
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册