Rails如何动态引入随请求变化文件名的JavaScript标签?
你遇到的核心问题是字符串插值在单引号中不生效,再加上资产管道的预编译配置可能没跟上,导致动态路径解析失败。下面分步骤给你解决办法:
第一步:修正字符串插值的引号问题
Ruby中只有双引号包裹的字符串才会解析#{}形式的插值表达式,单引号会把内容当成纯文本。你原来的代码用了单引号,所以#{I18n.locale}根本没被替换成实际的locale值,当I18n.locale解析异常时,就会生成locales/.js这种无效路径。
把代码改成双引号即可:<%= javascript_include_tag "locales/#{I18n.locale}.js" %>第二步:确保Locale文件被加入资产预编译列表
默认情况下,Rails资产管道不会自动预编译assets/javascripts/locales/子目录下的文件,所以即使路径正确,资产也找不到对应的文件。你需要在config/initializers/assets.rb中添加预编译规则:Rails.application.config.assets.precompile += %w( locales/*.js )这样Rails就会把locales目录下所有的JS文件都加入预编译列表。
第三步:验证Locale值的正确性
虽然你说同一文件其他地方能正常使用I18n.locale,但还是建议在视图里临时输出一下这个值确认:<%= "当前Locale: #{I18n.locale}" %>确保它输出的是
en-GB、en-CA这种和你的JS文件名完全匹配的字符串(注意大小写,Rails资产路径是区分大小写的)。额外注意:ERB后缀的处理
你的文件是en-GB.js.erb这种带.erb后缀的,Rails会在预编译时自动处理erb模板,生成对应的en-GB.js文件,所以你在javascript_include_tag里不需要加.erb后缀,这部分你之前的写法是对的。
按照这几步调整后,应该就能正确根据请求的Locale动态引入对应的JS文件了。
内容的提问来源于stack exchange,提问作者j_d

