如何使Daterangepicker适配Rails 6?兼容方案及替代gem咨询
一、尝试保留bootstrap-daterangepicker-rails的可行方法
你遇到的核心问题确实是这个gem的v3.0.3版本把railties的依赖范围锁在了>=4.0, <5.3,而Rails 6.0的railties版本是6.0.0.beta3,直接超出了这个限制。可以试试下面几个办法:
试用gem的开发分支(edge版)
有些gem的开发者可能已经在主分支悄悄适配了Rails 6,但还没发布正式版本。你可以修改Gemfile,直接引用它的GitHub仓库主分支:gem 'bootstrap-daterangepicker-rails', github: 'mllocs/bootstrap-daterangepicker-rails'然后运行
bundle update bootstrap-daterangepicker-rails,看看能不能正常安装。如果主分支已经更新了依赖限制,这个方法应该能快速解决问题。自己fork gem并放宽版本限制
如果官方仓库还没更新,你可以把这个gem fork到自己的GitHub账号,然后修改bootstrap-daterangepicker-rails.gemspec里的railties依赖行,把<5.3改成<7.0或者直接去掉版本上限:s.add_dependency 'railties', '>= 4.0' # 或者更稳妥一点:s.add_dependency 'railties', '>= 4.0', '< 7.0'之后在你的Gemfile里引用自己的fork:
gem 'bootstrap-daterangepicker-rails', github: '你的GitHub用户名/bootstrap-daterangepicker-rails'运行
bundle update后,一定要测试应用里的日期选择功能是否正常——毕竟只是放宽了版本限制,可能存在一些隐性的兼容性问题,重点验证日期选择、表单提交这些核心操作。等待官方发布兼容版本
如果不想折腾代码,你可以关注这个gem的GitHub仓库的Issues和Release页面,看看有没有开发者提到Rails 6的适配计划,或者有没有已经合并的PR解决这个问题。等官方发布支持Rails 6的正式版本后,再更新gem版本就好。
二、无法保留该gem时的替代方案
如果上面的方法都走不通,或者你不想花时间维护fork,推荐下面几个替代方案:
rails-daterangepicker:这是另一个对daterangepicker的Rails封装,支持较新的Rails版本,使用方式和你原来的gem几乎一致,Gemfile里添加:
gem 'rails-daterangepicker'跟着文档配置就能快速替换。
直接引入原生daterangepicker库:跳过gem封装,用Yarn直接安装原生库,更适配Rails 6的Webpacker环境:
- 运行
yarn add daterangepicker moment jquery - 在
app/javascript/packs/application.js里引入资源:import $ from 'jquery' import moment from 'moment' import 'daterangepicker' import 'daterangepicker/daterangepicker.css' - 然后按照原生daterangepicker的文档在视图里初始化组件就行,这种方式完全不受gem版本限制,灵活性更高。
- 运行
bootstrap4-datetimepicker-rails:如果你的需求不需要日期范围选择,只是单个日期时间选择,这个gem支持Bootstrap 4和新Rails版本,功能也很完善。
三、额外提示:解决其他gem的兼容问题
从你给出的bundle报错信息来看,除了daterangepicker,还有几个gem也存在版本冲突:
devise (~>4.5):当前版本依赖railties<6.0,可以升级到4.7+版本(已经支持Rails 6),修改Gemfile为gem 'devise', '~>4.7'sass-rails (~>5.0):这个版本依赖railties<6,升级到sass-rails (~>6.0)就能兼容Rails 6countries和country_select:country_select v3.1.1依赖countries ~>2.0,你可以在Gemfile里明确指定gem 'countries', '~>2.0',就能解决版本冲突。
把这些问题都处理完,你的bundle update应该就能顺利完成了。
内容的提问来源于stack exchange,提问作者Oliver Curting

