Rails 4中string.classify方法不符合预期的原因咨询
问题原因与解决办法
这是因为Rails的ActiveSupport词形变化器(Inflector)默认套用了拉丁语系的单复数转换规则,其中包含一条:将以"-a"结尾的名词复数形式,单数化为"-um"(典型例子如data→datum、media→medium)。
具体分析:
classify方法的异常结果:classify的执行逻辑是先对字符串做singularize(单数化)处理,再进行驼峰化。当处理'popup_cta'时,Inflector误将cta判定为这类复数名词,于是把它单数化为ctum,最终驼峰化得到PopupCtum。
而'popup_cta_'末尾的下划线会干扰Inflector的词尾识别逻辑,使其不会把cta当成需要转换的复数形式,因此单数化后仍为popup_cta,驼峰化得到预期的PopupCta。路由辅助方法的异常命名:
Rails生成路由辅助方法时,同样依赖Inflector的单复数转换规则。popup_cta作为资源名,会被Inflector单数化为popup_ctum(你提到的popup_ctam大概率是笔误),因此生成对应的单数路由辅助方法(如popup_ctum_path)。
解决办法:
在项目的config/initializers/inflections.rb文件中添加自定义词形变化规则,强制指定cta的单复数形式:
ActiveSupport::Inflector.inflections do |inflect| # 直接指定cta的单复数对应关系 inflect.singular 'cta', 'cta' inflect.plural 'cta', 'ctas' # 或者将cta标记为不可数名词(单复数同形) # inflect.uncountable %w( cta ) end
添加后重启服务,'popup_cta'.classify会返回PopupCta,路由也会生成正常的popup_cta_path等辅助方法。
内容的提问来源于stack exchange,提问作者simo
相关产品推荐
相关产品推荐

