javascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”
Posted
技术标签:
【中文标题】javascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”【英文标题】:javascript_include_tag Rails 4 generating "/javascripts/" instead of "/assets" in production 【发布时间】:2013-07-11 11:09:44 【问题描述】:我有一个带有
的 Rails 4 应用程序<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
在头脑中。在开发中,渲染了以下 html,并加载了modernizr:
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
在生产中,followign HTML 被渲染,modernizr 未加载(404 未找到):
<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>
在生产中,/assets/modernizr.js
被发现并可以浏览。
Rails documentation 表示javascript_include_tag
应该生成
<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>
在生产中,我的stylesheet_link_tag
s 很好,链接到/assets/
目录。
为什么在生产环境中javascript_include_tag
链接到/javascripts
而不是/assets
,我该如何解决?
【问题讨论】:
您找到解决方案了吗?我遇到了完全相同的问题,但这里的答案都没有帮助。 在生产中,你应该有一个像/assets/light-0cd9377b97b67182b68c8023bd6c2fbe.css
这样的指纹资产URL
这是干净的 Rails 4 应用还是从早期 Rails 版本升级?
【参考方案1】:
AssetUrlHelper 的使用声明之一表明它将生成 /javascripts/ url 就像你看到的那样:
#asset_path "application", 输入: :javascript # => /javascripts/application.js
(来自 assets_url_helper.rb 第 117 行 - [1])
此代码看起来只有在缺少预编译资产的情况下才能访问 所以看起来你的资产编译不起作用(我的部署通常 发生这种情况时会失败,所以也许你的甚至没有开火)。
相同的asset_url_helper.rb 调用/javascripts/ 部分'extname' 和 使用以下地图知道如何生成名称:
# Maps asset types to public directory.
ASSET_PUBLIC_DIRECTORIES =
audio: '/audios',
font: '/fonts',
image: '/images',
javascript: '/javascripts',
stylesheet: '/stylesheets',
video: '/videos'
一个新的 Rails 4 应用在 config/environments/production.rb 中有这个
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
这似乎与您看到的行为相符。
【讨论】:
谢谢!一些 js/css 文件没有预编译,因为它不能与 application.js/css 文件关联,所以 rails 4 assets precompile 找不到这些文件。您可以将文件添加到预编译文件列表中,如下#config/environments/production.rb config.assets.precompile += [ Proc.new |path| File.basename(path) =~ /^[^_].*\.\w+$/ ]
Rails 的资产管道似乎有一些非常糟糕的默认值。【参考方案2】:
默认情况下,Rails 只预编译 application.js
、application.css
以及它在资产路径中找到的任何图像。因此,在生产中,mordernizr 不会被预编译,因此 javascript 助手将无法找到该文件。
为了解决这个问题,您可以通过修改production.rb
中的以下配置将modernizr添加到预编译列表中
config.assets.precompile += ['modernizr.js']
欲了解更多信息,请参阅the Rails Guides
【讨论】:
这个答案是正确的。在 prod 中,如果javascript_include_tag
在搜索路径中找不到预编译的 javascript 资产(我认为是 ./public/assets/
),它将生成以 /javascripts/
开头的 src
(Rails 认为您会将这些资产放在 ./public/javascripts/
)。在 dev 中,config.assets.compile
设置为 true
,所以如果 javascript_include_tag
找不到 ./public/assets
中的资产,rails 会编译资产,然后它会找到它。在生产中,config.assets.compile
是 false
。因此,请使用config.assets.precompile
确保您的资产已预编译。【参考方案3】:
请务必通过运行以下命令在生产环境中预编译您的资产:
RAILS_ENV=production bundle exec rake assets:precompile
资产管道上的 Rails 指南可以为您提供更多详细信息:http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
【讨论】:
但这只会将资产编译到public/assets/
文件夹中 - 它不能解释为什么路径生成不正确。
您是否更改了production.rb
中的路径?它看起来像 config.assets.prefix = "/some_other_path"
guides.rubyonrails.org/…
不,我没有。我在vendor/
中的所有资产都正确编译到/assets
中,并且路径是正确的。只是/app/assets
中的javascripts 出于某种原因有javascript_include_tag
生成的错误路径。是的,我将它们添加到precompile
。真是奇怪的行为......【参考方案4】:
我有一个使用 Rails 4 部署在 Heroku 上的新应用程序:
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
我的 javascript application.(fingerprint).js 从 src 调用:assets/application.js
我认为您的问题来自您的 production.rb 中的某些东西,他们从另一个位置定义了资产。
所以也许你可以将 Moderniz.js 添加到
config.assets.precompile = ['.js', '.css', '*.css.erb']
在 config/production.rb 中
或者只是在你的 application.js 中需要 modernizr 脚本
//= 需要现代人
并将modernizr 脚本调用删除到您的布局中。
<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>
您能检查一下您的 application.js 是从哪里提供给您的生产环境的吗?
【讨论】:
【参考方案5】:这可能是因为此文件需要位于 /vendor/assets/javascript 而不是 /app/assets/javascript 中。 Vendor 文件夹用于存放 JavaScript 库,App 文件夹用于存放您的代码。
比在布局中添加标签更好的解决方案是向 application.js 添加脚本引用,然后让 sass 编译器压缩并将其附加到主 javascript 文件中。
如果您没有得到明确的答案,请查看: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization
【讨论】:
/vendor/assets/javascript/
和/app/assets/javascript/
文件夹中的文件被编译到public/assets/
文件夹中,生成的manifest.json
文件描述了查找指纹文件的逻辑路径。但是,要使其正常工作,javascript_include_tag
生成的路径仍需要指向 assets/
。以上是关于javascript_include_tag Rails 4 在生产中生成“/javascripts/”而不是“/assets”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 1.9.1 而不是 jquery 1.4