我有一个orders.js.coffee文件,其中包含一些禁用订单页面中的结帐按钮的代码。现在,结帐按钮显示在网站的每个页面上,因为它在应用程序布局上使用ajax呈现为部分。所以现在当我进入订单页面时,它应该被禁用。它会禁用,但它也会在每个其他页面中禁用。如何使orders.js.coffee文件仅在订单页面生效。感谢
答案 0 :(得分:0)
默认情况下,Rails包含每个页面中assets/javascripts
目录中的每个文件。这就是require_tree .
指令在application.js
中的作用。
要改变此行为,您需要:
require_tree .
application.js
行
在订单页面使用的布局中,明确添加orders.js
:
<%= javascript_include_tag "orders" %>
将orders.js
添加到config/initializers/assets.rb
中的预编译步骤:
Rails.application.config.assets.precompile += %w( orders.js )
您可以在此博客文章中找到类似但更灵活的详细信息(完全披露,我写了):http://theflyingdeveloper.com/controller-specific-assets-with-rails-4/
答案 1 :(得分:0)
如果您为每个控制器使用相同的布局,那么要使您的orders.js.coffee文件特定于orders_controller,您可以执行以下操作:
<% if params[:controller] == "orders" %>
<%= javascript_include_tag "orders" %>
<% end %>
您需要从application.js文件中remove the //= require_tree .
并单独要求每个文件。
如果您使用结帐页面的其他布局,则只需添加
<%= javascript_include_tag "application" %>
<%= javascript_include_tag "order" %> #add this only for the checkout layout
您还可以使用
在应用中添加控制器特定的j<%= javascript_include_tag params[:controller] %> #here params[:controller] will be replaced by your controller name and hence only that js will be loaded for that controller.
有关详细信息,请参阅here
答案 2 :(得分:0)
最简单的方法是在禁用按钮之前检查您所在的页面。因此,正如@Mandeep所指出的,require tree .
将所有内容放在一个Javascript文件中。因此,您渲染的每个页面都可以使用所有代码。考虑一下:
disable_orders_button ->
$('#some-orders-button-selector').hide() # or whatever you want to do.
page_is_orders ->
Location.href.match(/orders/) isnt null
$(document).ready ->
disable_orders_button() if page_is_orders()
您可以在订单页面上使用特定ID进行一些调整,以便只在该页面上找到该按钮。即,
<html>
<body id="orders">
<!-- other stuff -->
<button id="order">Order</button>
</body>
<html>
# Coffeescript
$('body#orders > button#order').hide()
这是航空代码,但它应该说明您可能会使用的一些技术。