在Rails中包含特定于页面的JavaScript的正确方法

时间:2014-04-28 14:12:00

标签: javascript jquery ruby-on-rails

我想包括这个,例如:

jQuery(document).ready(function($) {
    $('#my-modal').modal(options)
});

在rails应用中的一个特定位置。在我的例子中,该文件名为views / modals / mymodal.html.erb。那里只有那里。

如果不将它放在所有页面上,我就无法弄明白如何做到这一点,如果我把它放在资产中就会发生。

5 个答案:

答案 0 :(得分:6)

这些是一些有用的技巧

#1,文件为js

  • 为您的javascript
  • 创建文件your.js
  • 针对特定布局调用文件your.js
  • 删除//= require_tree .
  • 上的application.js
  • your.js添加到资产预编译on config/application.rbconfig.assets.precompile += %w( your.js )

#2放入特定文件非布局(不推荐)

mymodal.html.erb

上添加带有javascript标记的js脚本

#3使用if..else ..

将您的js脚本放入layout/yourlayout.html.erb并使用if.. else..逻辑。

示例:

 <% if current_page?(yourspecific_path) %>
  <script language="text/javascript">
   your javascript here ..
  </script>
 <% end %>

关于current_page?

了解更多here

或使用request.fullpath获取当前的完整路径

示例:

 <% if request.fullpath == yourspecific_path %>
  <script language="text/javascript">
   your javascript here ..
  </script>
 <% end %>

关于request.fullpath

了解更多here

如果您希望将脚本放入文件.js

,也可以合并#1和#3

欢呼声

答案 1 :(得分:1)

其中一个解决方案是将我们的javascript插入到自己的文件中:Reference Link

例如:

// app / assets / javascripts / alert.js

alert("My example alert box.");

仅在我们希望它执行的视图中包含此文件:

<%# app/views/page/contact.html.erb %>
<%= javascript_include_tag "alert" %>
<h1>Contact</h1>
<p>This is the contact page</p>

不要忘记将新文件包含在要编译的文件列表中:

# config/environments/production.rb
config.assets.precompile += %w( alert.js )

答案 2 :(得分:1)

鉴于您要包含的JS文件名为my_modal.js

  1. 将放置在JS中的assets/javascripts个文件放在其中的某个目录中 assets/javascripts,例如application

  2. //= require_tree .中将行//= require_tree application更改为application.js(它会阻止在每个页面上加载my_modal.js)。

  3. my_modal.js放入assets/javasctripts

  4. my_modal.js中将config.assets.precompile添加到config assets.precompile += ['my_modal.js']数组(application.rb)。

  5. javascript_include_tag 'my_modal'放在您希望包含此文件的视图中

  6. 您可以访问Rails guides作为参考。

答案 3 :(得分:1)

晚会,但对于今天观看此活动的任何人来说,我认为我已经提出了更好的建议。

Punchbox Gem for Rails

有了这个,您可以编写如下代码:

class Post {
  controller() {
    // Runs on every action
  }
  index() {
    // Runs on just the index action
  }
}

Punchbox.on('Posts', Post);

(您也可以创建一个对象而不是一个类。请参阅文档)

我已经在这里更深入地写了这篇文章:https://kierancodes.com/blog/page-specific-javascript-in-rails-4

答案 4 :(得分:0)

jquery-readyselector是一个插件,&#34;扩展$().ready()以便为特定于页面的脚本提供方便的语法&#34;

  1. 安装jquery-readyselector

  2. 创建一些CSS类

    <body class="<%= controller_name %> <%= action_name %>">
    
  3. 将您的JavaScript范围扩展到您的网页

    $("#my-modal").ready(function() {
      $('#my-modal').modal(options)
    });
    
  4. 此答案中的更多信息How to load page specific rails 4 js files?