包含不影响rails中其他页面的javascript文件

时间:2014-06-25 16:06:20

标签: ruby-on-rails

我有一个orders.js.coffee文件,其中包含一些禁用订单页面中的结帐按钮的代码。现在,结帐按钮显示在网站的每个页面上,因为它在应用程序布局上使用ajax呈现为部分。所以现在当我进入订单页面时,它应该被禁用。它会禁用,但它也会在每个其他页面中禁用。如何使orders.js.coffee文件仅在订单页面生效。感谢

3 个答案:

答案 0 :(得分:0)

默认情况下,Rails包含每个页面中assets/javascripts目录中的每个文件。这就是require_tree .指令在application.js中的作用。

要改变此行为,您需要:

  1. require_tree .
  2. 中删除application.js
  3. 在订单页面使用的布局中,明确添加orders.js

    <%= javascript_include_tag "orders" %>

  4. orders.js添加到config/initializers/assets.rb中的预编译步骤:

    Rails.application.config.assets.precompile += %w( orders.js )

  5. 您可以在此博客文章中找到类似但更灵活的详细信息(完全披露,我写了):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()

这是航空代码,但它应该说明您可能会使用的一些技术。