首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails js文件和页面特定的js

Rails js文件和页面特定的js
EN

Stack Overflow用户
提问于 2016-12-20 16:44:17
回答 3查看 9.1K关注 0票数 13

在rails上,我将所有的JavaScript文件放入应用程序的js文件中。

代码语言:javascript
复制
//= require jquery
//= require jquery_ujs
//= require dropzone
//= require jquery.cookie
//= require toastr

//VENDOR JS BEGINS
//= require pace/pace.min
//= require modernizr.custom
//= require jquery-ui/jquery-ui.min
//= require boostrapv3/js/bootstrap.min
//= require jquery/jquery-easy
//= require jquery-unveil/jquery.unveil.min
//= require jquery-bez/jquery.bez.min
//= require jquery-ios-list/jquery.ioslist.min
//= require jquery-actual/jquery.actual.min
//= require jquery-scrollbar/jquery.scrollbar.min
//= require bootstrap-select2/select2.min
//= require switchery/js/switchery.min
//= require imagesloaded/imagesloaded.pkgd.min
//= require jquery-isotope/isotope.pkgd.min
//= require classie/classie
//= require codrops-stepsform/js/stepsForm
//= require bootstrap-datepicker/js/bootstrap-datepicker

然后,我调用application.html.erb头部中的javascript作为;

代码语言:javascript
复制
...
<head>
..
<%= javascript_include_tag 'application' %>    
..
</head>
...

然后我检查了网站的速度,建议我把这个JS调用发送到body。我知道我应该BTW。但问题出在页面特定的JS代码上。

假设我有一个home.html.erb,用户可以选择date。所以我把datapicker代码放到这个页面中。

如果我将<%= javascript_include_tag 'application' %>放在主体的底部,这一次是因为jquery和datepicker还没有加载,所以特定于页面的JS提供了no method error

最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-21 04:58:14

在body结束标记之前,紧跟在<%= javascript_include_tag 'application' %>之后

添加<%= yield :page_scripts %>

然后在特定视图中的任意位置(通常在顶部)使用以下命令设置脚本:

代码语言:javascript
复制
<% content_for :page_scripts do %>
  <script>alert( "My nice scripts..." );</script>
<% end %>
票数 12
EN

Stack Overflow用户

发布于 2017-07-04 07:23:37

http://brandonhilkert.com/blog/page-specific-javascript-in-rails/上有一个非常好的答案。

基本上,您希望打开app/views/layout/application.html.erb,并说服它在每次呈现页面时为您提供控制器和视图信息。为此,您需要将body标记从

代码语言:javascript
复制
<body> 
  <%= yield %>
</body

代码语言:javascript
复制
<body class="<%= controller_name %> <%= action_name %>">
  <%= yield %>
</body>

因此,当rails呈现body标记时,它现在将为控制器添加一个类,并在控制器中添加一个操作。

假设您有一个名为static_pages的控制器,而static_pages控制器具有

代码语言:javascript
复制
def home 
end

当rails呈现视图/页面主页时,它现在将在主体标记中添加一个static_pages类和一个 home 类。

代码语言:javascript
复制
<body class="static_pages home">
    the home view is rendered here
</body>

这将是站点范围的更改,因此,如果从用户控制器转到索引页面/视图,则主体标记将为:

代码语言:javascript
复制
<body class="users index">
    the index view is rendered here
</body>

现在,创建一个名为vendor/assets/javascripts/jquery-readyselector.js的文件,其中包含:

代码语言:javascript
复制
(function ($) {
  var ready = $.fn.ready;
  $.fn.ready = function (fn) {
    if (this.context === undefined) {
      // The $().ready(fn) case.
      ready(fn);
    } else if (this.selector) {
      ready($.proxy(function(){
        $(this.selector, this.context).each(fn);
      }, this));
    } else {
      ready($.proxy(function(){
        $(this).each(fn);
      }, this));
    }
  }
})(jQuery);

必须在application.js中正确引用该文件

代码语言:javascript
复制
...
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require jquery-readyselector
//= require_tree . 

所有这些都完成后,您可以通过为您想要测试的视图创建一个简单的警报来测试它,如下所示:

代码语言:javascript
复制
// app/assets/javascripts/static_pages_home.js

$(".static_pages.home").ready(function() {
  return alert("You should only see this on the static pages home page.");
});


// app/assets/javascripts/user_index.js

$(".users.index").ready(function() {
  return alert("You should only see this on the users index page.");
});

您还可以通过不引用操作来指定特定的脚本控制器。

代码语言:javascript
复制
$(".users").ready(function() {
  return alert("You should only see this on a users controller controlled page.");
});
票数 9
EN

Stack Overflow用户

发布于 2017-07-11 15:00:47

你也可以看看Page-specific Javascript for Rails done right。这值得一看!

Installation

安装之后。让我们看一下示例代码。

代码语言:javascript
复制
var ArticlesController = Paloma.controller('Articles');

ArticlesController.prototype.edit = function(){
  // Handle edit article
};

这意味着如果你有文章控制器的编辑操作页面。那么只有javascript会被触发。这不会在其他控制器操作中触发。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41238020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档