ruby Rails资产在生产环境中不可用

3b6akqbq  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(214)

我有一个特殊的问题。在一个(大的)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')
gcuhipw9

gcuhipw91#

你删除了公共目录文件夹中的所有文件,然后重新启动服务器?在你的js文件夹中也有一个文件夹
reader/locale/en.js
?仔细检查所有路径,如果在开发中有效,则应检查生产中的错误日志,以查看问题的来源。

t1rydlwq

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}" %>结合使用,因为我实际上有很多语言环境文件。

mf98qq94

mf98qq943#

出现了同样的问题,结果是config/environments/production.rb中有一行:

config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?

它不允许Rails提供静态文件,包括预编译的资产。

config.public_file_server.enabled = true

修复了该问题。
这是因为Nginx和Apache自己处理静态服务,但是Rails默认配置为使用Puma,所以默认使用这些设置并没有多大意义。

相关问题