2013-08-24 65 views
0

通過this question我學會了一種聰明的技巧,只在特定頁面上包含外部腳本。只在某些動作中啓用js功能

但我知道遇到後續問題:引用該腳本的函數(包含在//= require_tree .中)在所有其他頁面(其中未包括外部腳本)導致錯誤。

在Rails中,我可以放置一個函數(或者我怎樣編寫它),其引用的外部腳本只包含在將要使用的那些頁面(操作)中,以便它不會在所有其他網頁?

回答

0

不需要在視圖中檢查控制器和操作。 將控制器和動作添加到您的身體標記中。 然後在您的JavaScript代碼中,使用if條件來檢查這些屬性並運行腳本。

+0

是的,那個作品: 'if($('body.posts.show')。length> = 1){function myFunction()}' 但是,Web控制檯仍然顯示相同錯誤消息,但它只閃爍它,只是一瞬間。爲什麼當運行它的條件失敗時,它會注意到這個函數? –

+0

只需使用if($('body.posts.show')。length {})。有些東西是關閉的= =我 – TheIrishGuy

0

這可能不是最優雅(或高效)的方式,但是在這種情況下,我檢查控制器和操作,然後在我的佈局中添加javascript_include_tag。示例:

<% if :controller == 'maps' && :action == 'show' %> 
    <%= javascript_include_tag "https://maps.googleapis.com/maps/api/js" %> 
<% end %> 
+0

是的,那是外部腳本。但問題是如何最好地處理調用該腳本的函數,因爲如果我將它放在資產管道樹中的所有其他函數中,它將嘗試在所有頁面上調用該腳本,並在它不找到它... –

1

還有gemPaloma在Rails中處理特定頁面javascripts

快速例如:

The javascript callback file /assets/javascripts/paloma/users/new.js: 

Paloma.callbacks['users']['new'] = function(params){ 
    // This will only run after executing users/new action 
    alert('Hello New Sexy User'); 
}; 

The Rails controller app/controllers/users_controller.rb: 

def UsersController < ApplicationController 
    def new 
     @user = User.new 
     # No special function to call, the javascript callback will be executed automatically 
     # just for this specific action. 
    end 
end 
+0

有趣的是,在一個具有更多功能的項目中,我可以看到這非常有用。 –

+0

好吧,那麼請考慮upvote我的答案,如果它對你有用:) – mark10

2

我一直在尋找答案的問題,以及在相當一段時間。

最後,我意識到:

  1. 我喜歡的資產管道,我不希望處理處置資產的自己。所以我嘗試儘可能我可以有我所有的js文件與資產管道

  2. 使用content_for處理是非常方便的JS的包括塊,其中只需要在特定的觀點:

上佈局文件(佈局/ application.html.erb)做

<%= yield :scripts %> 

<head>標籤內

那麼您的具體看法寫

<% content_for :scripts do %> 
<script> 
you js code goes here regularly 
</script> 
<% end %> 

那麼Rails會知道採取該位,並將其放置在:腳本 這將確保您的JS位被加載,只有當你真正需要它們

如果其特定的文件,你想:

將這些文件放在assets/javascripts下的文件夾中。讓我們把它叫做Others

Others地方yourjs.js文件,並在application.js清單不包括樹

現在,鏈輪不參與Others的文件。

然後你可以用上面的方法與content_for包括特定文件

<% content_for :scripts do %> 
<%= javascript_include_tag "Others/yourjs.js" %> 
<% end %> 
相關問題