我有一个特殊的问题。在一个(大的)rails设置中,我在/app/assets/reader/
中有一个 Backbone.js 项目。我所有的javascript资产都是动态预编译到reader.js
中的,这很好。我在locale/
中的i10n文件不太好用,因为它们不需要任何预编译。在开发中它工作得很好,但是在生产中它们不可用。
在我的/app/views/layouts/reader.html.erb
文件中,我有以下几行:
<%= javascript_include_tag "reader" %>
<%= javascript_include_tag "locale/en" %>
问题是较低的一个会导致生产上出现404错误。
我尝试过以下替代方案:
<%= javascript_include_tag "en" %>
<%= javascript_include_tag "locale/en" %>
<%= javascript_include_tag "reader/locale/en" %>
这些似乎都不起作用。最后一个甚至在开发时坏了。
PS:在applicaton.rb
我有:
...
config.assets.precompile += [
...
'reader.js',
...
]
...
config.assets.paths << File.join(Rails.root, 'app', 'assets', 'reader', 'locale')
3条答案
按热度按时间gcuhipw91#
你删除了公共目录文件夹中的所有文件,然后重新启动服务器?在你的js文件夹中也有一个文件夹
reader/locale/en.js
?仔细检查所有路径,如果在开发中有效,则应检查生产中的错误日志,以查看问题的来源。
t1rydlwq2#
解决方案不在
javascript_include_tag
中,而是在config.assets.precompile
的格式中。默认情况下,Rails会直接扫描
assets
中的任何子文件夹,这意味着必须将locale文件作为locale/en.js
添加到config.assets.precompile
中,而config.assets.paths
行甚至根本就不是必需的。Rails扫描子文件夹的方式是非常具体和重要的。如果做对了,它应该会像微风一样工作。一旦你知道了它是如何工作的,它实际上会变得非常强大。
专业提示:我最终将
locale/*.js
与<%= javascript_include_tag "locale/#{I18n.locale}" %>
结合使用,因为我实际上有很多语言环境文件。mf98qq943#
出现了同样的问题,结果是
config/environments/production.rb
中有一行:它不允许Rails提供静态文件,包括预编译的资产。
修复了该问题。
这是因为Nginx和Apache自己处理静态服务,但是Rails默认配置为使用Puma,所以默认使用这些设置并没有多大意义。