Rails - Rails.root.join 部署后行为异常

Rails - Rails.root.join misbehaving after deployment

我的 app/assets 目录中有目录 javascripts 和样式表,就像任何普通的 Rails 应用程序一样。

不过,我也想要一个插件目录。

示例:

app/assets/plugins/myPlugin1/somefile.js
app/assets/plugins/myPlugin1/somefile.css

事实是,如果我使用

<%= javascript_include_tag 'plugins/myPlugin1/somefile.js' %>

我会收到 404 错误,因为

/assets/javascripts/plugins/myPlugin1/somefile.js

不存在。然后,我注意到 "plugins" 目录试图在 javascript 中被访问。我认为这与 "javascript_include_tag".

有关

经过一些研究,我意识到我必须将这一行包含到 config/application.rb

config.assets.paths << Rails.root.join("app", "assets")

它似乎奏效了。在 WEBRick 上,在开发上,它工作得很好。


现在我成功部署到服务器,预编译了资产,我以为我已经准备好了。

目录

/public/assets/

已创建。 "app/assets/javascripts"、"app/assets/stylesheets" 和 "app/assets/plugins" 中的所有内容都预编译为 public/assets

什么有效

app/assets/javascripts/login.js

能够在具有

的视图中访问
<%= javascript_include_tag 'login.js' %>

什么不起作用

属于 "plugins" 的文件。

app/assets/plugins/myPlugin1/somefile.js

被预编译为

public/assets/myPlugin1/somefile.js

但是当我运行

<%= javascript_include_tag 'plugins/myPlugin1/somefile.js' %>

它尝试访问

/javascripts/plugins/myPlugin1/somefile.js

根据我的开发经验,正确的路径应该是:

/myPlugin1/somefile-(some hex hash).js

因此,如您所见,在生产中我遇到了与未添加时相同的问题

config.assets.paths << Rails.root.join("app", "assets")

到application.rb

可能是什么问题?

你可以这样走:

Dir.glob("#{Rails.root}/app/assets/plugins/**/").each do |path|
  config.assets.paths << path
end

或者设置每个插件,像这样一一设置:

config.assets.paths << Rails.root.join("app", "assets", "plugins", "myPlugin")

但是如果您在那个 myPlugin 目录上有子目录,则不会加载每个文件。所以第一个选项可能更适合你。