【问题标题】:How do I include custom javascript on/for a single page in Rails?如何在 Rails 中的单个页面上包含自定义 javascript?
【发布时间】:2025-11-30 21:35:01
【问题描述】:

我的网站有一个交互式标题,位于 /views/layouts/_header.html.haml。

我希望将标头的所有 JavaScript 收集到一个文件中。最重要的是,我将 Twitter Typeahead 和 Bloodhound 用于带有自动建议的搜索字段。很多 JavaScript 必须在标头呈现后运行,因此它包含在 application.js 中(包含在我的 application.html.haml 页面中)不起作用,因为它在标头呈现之前运行。

我在 /assets/javascripts/ 下添加了 search-bar.js,其中包含我需要在此页面上运行的所有 JS。

在我的 _header.html.haml 的底部,我只是链接了一个常规脚本标签。

%script{src:"/assets/movie-search-bar.js", type:'text/javascript'}

这在本地运行良好,但在我的开发服务器上,我得到了该资产的 404。是否可能出于性能原因丢弃静态文件?即使它确实有效,通过将其包含在资产管道中,脚本不会被加载两次(一次作为单个脚本,一次在 application.js 中)?

我的印象是,这不是将部分的 javascript 隔离到自己的文件中的最佳方法。确保脚本在 _header 渲染后加载一次并在其自己的 JavaScript 文件中隔离的最佳和最“可靠”的方法是什么?

编辑:这可能就像将以下几行移动到我的页脚部分底部一样简单吗?这在 Rails 中被认为是好的做法吗?

#{ stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true }
#{ javascript_include_tag 'application', 'data-turbolinks-track' => true }

【问题讨论】:

  • 我的回答对您有帮助吗?

标签: javascript html ruby-on-rails asset-pipeline haml


【解决方案1】:

您可以在application.js 以外的脚本上使用javascript_include_tag。首先,确保您的脚本位于app/assets/javascripts 文件夹中:app/assets/javascripts/movie-search-bar.js

然后在您的视图中使用javascript_include_tag 助手:

javascript_include_tag 'movie-search-bar'

并告诉 Rails 预编译该资产。

config.assets.precompile << "movie-search-bar.js"

【讨论】:

    【解决方案2】:

    好吧,我已经完成了这项任务。如果你想在你的视图中包含一个特定的 javascript。首先在你的视图文件夹中创建一个文件夹。例如 page_js,然后创建一些像 _file.html.erb 这样的部分。然后放置你的 javascript进入它。然后在任何你想要的地方渲染那个文件。所以你的javascript只适用于那个特定的页面。如果它不起作用,那么告诉我。

    【讨论】:

      最近更新 更多