据我所知,您的所有JavaScript都合并为1个文件.当Rails添加//= require_tree .到application.js清单文件的底部时,默认情况下会执行此操作.
这听起来像是一个真正的生命保护程序,但我有点担心特定于页面的JavaScript代码.此代码是否在每个页面上执行?我想要的最后一件事是,只需要在1页上需要为每个页面实例化我的所有对象.
此外,代码是否也存在冲突的可能性?
或者你是否script在页面底部放了一个小标签,只是调用一个执行页面javascript代码的方法?
那你不再需要require.js了吗?
谢谢
编辑:我很感谢所有的答案......我认为他们并没有真正解决问题.其中一些是关于造型而且似乎没有关联...而其他人只是提到javascript_include_tag......我知道存在(显然......)但是看起来Rails 3.1的方式将会包括所有的将您的JavaScript编入1个文件,而不是在每个页面的底部加载单独的JavaScript.
我能想到的最好的解决方案是div用ids或classes 包装标签中的某些功能.在JavaScript代码,你只要检查id或class在页面上,如果是,您在运行与之相关联的JavaScript代码.这样,如果动态元素不在页面上,则JavaScript代码不会运行 - 即使它已包含在application.js由Sprockets打包的大量文件中.
我的上述解决方案的好处是,如果在100个页面中的8个页面中包含搜索框,则它将仅在这8个页面上运行.您也不必在网站的8个页面上包含相同的代码.实际上,您永远不必在任何地方再次在您的网站上包含手动脚本标记.
我认为这是我问题的实际答案.
javascript ruby-on-rails ruby-on-rails-3.1 sprockets asset-pipeline
编辑:一年后,如果我要再次这样做,我会用curl.js代替Rails资产管道.
相关:在Rails 3应用程序中添加页面特定javascript的最佳方法?
我正在编写一个应用程序,并使用coffeescript生成所有的js.这就是相关问题不能满足我需要的原因.
我希望能够将coffeescript文件放在我的资产目录的子文件夹中,并且只能在一个页面上提供.coffee文件.该页面位于命名路由上
match 'myNotifications' => 'user#notifications'
最明显的事情是将.coffee文件放入assets\javascripts\user\index.js.coffee.但在阅读有关资产的文档后,我不清楚.
我读了这一行(来自http://guides.rubyonrails.org/asset_pipeline.html):
您应该将任何JavaScript或CSS唯一的控件放在各自的资产文件中,因为这些文件可以仅为这些控制器加载,例如<%= javascript_include_tag params [:controller]%>或<%= stylesheet_link_tag params [ :controller]%>.
好的很酷,所以我把页面特定的js放入assets\javascripts\user.js.coffee.然后我重新加载了我的主页,按Ctrl F5.user.js文件仍在主页上加载.经测试$ -> alert 'ready from users controller'; 加载主页时看到警报.
Rails是否有办法让每页的coffeescript文件只能与该页面一起提供?我读错了吗?在assets文件夹中是否有一个地方可以放入.coffee文件,它们不会被每个页面加载?
更新:看起来我可能有一个答案:
有几种方法可以解决这个问题.我们可以使用require_directory而不是require_tree,因为这只会加载当前目录中的文件而不是子目录中的文件.如果我们想要更多地控制包含的文件,我们可以单独地要求它们而不是包括整个目录.或者,我们可以将我们想要包含在所有页面上的JavaScript文件移动到公共子目录中.然后我们可以使用require_tree ./public来包含那些文件.
我会在上午给出一个镜头.
使用Rails 3.2.1
我使用命令创建了一个名为Home的简单控制器:
rails g controller Home index
Run Code Online (Sandbox Code Playgroud)
它为我创建了一个新的控制器和视图:

注意有两个样式表,一个是"应用程序",另一个是"主页".我找不到任何文档来支持这个假设,但我猜你把样式只应用于Home.css.scss文件中的"Home"视图,对吗?
因此,作为测试,我在Application.css.scss.erb中添加了一些全局样式并运行了应用程序.
样式按预期应用.
接下来,我在Home.css.scss文件中添加了一些规则,并访问了一个"Home/index"视图,但该文件中的样式未附加,既不作为单独的CSS引用链接,也不附加到单个Application.css.scss文件.这对我来说非常困惑,因为评论说:
// Place all the styles related to the Home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
Run Code Online (Sandbox Code Playgroud)
为什么Home.css.scss中写的规则不适用于我的网站?
刚刚安装了rails 3.1 rc1,我试图用新资产管道来管理javascript的最佳方法默认情况下,所有coffeescript都被编译成一个application.js文件,这是一件好事.
每个单独的咖啡脚本文件都附加到js文件并包装在一个匿名函数中,该函数通过调用方法执行.常见的场景是使用一些jquery将各种表单转换为ajax表单,更新UI等...
这些脚本中的许多都是特定于控制器或动作的,我试图用"常规"方式来处理这个,因为所有内容都包含在一个匿名函数中,我如何只执行特定控制器/动作的代码,默认情况下,正在执行所有匿名函数
我确实玩了一些hacks,我将控制器和动作名称加载到js变量中,然后在coffeescript中检查那些有条件地运行代码,我不是很喜欢
我最初的想法是每个咖啡文件都包含一个js命名空间/对象,我会从视图中调用特定的那些,使用default_bare = true配置来调用它
请参阅如何在Rails 3.1 for CoffeeScript中使用选项"--bare"?
编辑
再看一些:看起来这可能是正确的方法 - 使用Rails 3.1和Coffeescript"找不到变量"错误
我调查了类似的线程,但我无法抓住.下面是我的application.js文件.
//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require vendor
//= require_tree .
Run Code Online (Sandbox Code Playgroud)
我有一个资产管道的目录结构如下.
--javascripts
-misc // directory
helper.js
session.js
app.js
application.js
home.js
Run Code Online (Sandbox Code Playgroud)
我如何加载所有页面的misc目录和home.js for HomeController和session.js SessionController.我不想让不需要的JS在每个地方加载.
我试图在特定页面上运行javascript,我唯一的解决方案似乎是反模式.我在controller.js里面生成了assets/javascripts/.我正在使用gem 'jquery-turbolinks'我的代码类似于以下内容:
$(document).ready(function () {
//Initiate DataTables ect..
}
)
Run Code Online (Sandbox Code Playgroud)
此代码在每个页面上触发,因此我在其中添加了以下内容.
if ($('#page-specific_element').length > 0) {
//Initiate Datatables ect.
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法设置rails只使用特定控制器所需的javascript文件或逻辑门控元素搜索最佳解决方案?
我有一个rails应用程序,我试图让jQuery呈现一个HTML文件.这一点的意思是jQuery是特定于页面的,所以我不希望它通过将它放在标题中来加载每个页面.这是我对文件所做的
messages_controller.rb
# GET /messages/new
def new
@message = Message.new
@users = User.where('id != ' + current_user.id.to_s)
#if @message.save
#MessageMailer.new_message(@message).deliver
respond_to do |format|
format.html # new.html.erb
format.js
end
#end
end
Run Code Online (Sandbox Code Playgroud)
/messages/new.html.erb
<div class="row">
<div class="large-12 columns">
<div class="panel">
<h1>New message</h1>
<%= render 'form' %>
<%= link_to 'Back', messages_path, :class => "button small" %>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
/messages/new.js.erb
$("h1").html('hello'); //for testing that it works
Run Code Online (Sandbox Code Playgroud)
有什么东西我必须添加到另一个文件?是否有我要做的请求,所以它加载HTML和.js?
我是Rails的新手,现在还不太了解资产管道…
我想让
views/product/product.js
Run Code Online (Sandbox Code Playgroud)
之后自动射击
views/product/index.html.erb
Run Code Online (Sandbox Code Playgroud)
由于DRY原因而被渲染。
加载任何或部分model.erb文件后,资产管道中是否有一个地方调用model.js文件?
我知道如何手动操作,并删除了
app/assets/javascripts/product.js
Run Code Online (Sandbox Code Playgroud)
但是然后我必须在新的show中调用doSomethingAfterPageload()方法。删除等。甚至更好,如果这也适用于部分。
我使用主动管理员,在我的应用程序中有不同的.js必须加载到特定页面(不是全部).
关注此主题在Rails 3应用程序中添加页面特定javascript的最佳方法?它看起来很简单,但是编译了活动管理员中的布局.
我使用了一种解决方法来覆盖页脚:
class ActiveAdmin::Views::Pages::Base < Arbre::HTML::Document
private
# Renders the content for the footer
def build_footer
div :id => "footer" do
para "Copyright © #{Date.today.year.to_s}- All rights reserved ".html_safe
end
end
end
Run Code Online (Sandbox Code Playgroud)
如何在某些页面的标题中添加一些.js?如何解决方法?(如果可能的话,使用"yield:head"或类似的东西,所以我可以从任何地方轻松地调用它;))
编辑注意:我想要包含的js渲染一个highcharts
我需要问我的用户是否会使用信用卡支付服务...如果它选中了pay_with_card选项?它必须显示表格的其余部分,要求其他数据,如卡号,邮件等,如果用户没有检查它,它必须显示一条消息,问题是......我该怎么做?提前致谢
<%= form_for(@product) do |f| %>
<%= f.label :pay_with_card? %>
<%= f.check_box :pay_with_card,{}, "Yes", "No"%>
<div>
<%= f.label :card_number %> <%= f.text_field :card_number %>
</div>
<div>
<%= f.label :mail %> <%= f.text_field :mail %>
</div>
<% end %>
Run Code Online (Sandbox Code Playgroud) javascript ×5
jquery ×3
coffeescript ×2
actionview ×1
activeadmin ×1
checkbox ×1
css ×1
forms ×1
head ×1
highcharts ×1
sass ×1
sprockets ×1