63

有什麼方法可以使用Rails幫助器方法,更具體地說,是一個JavaScript資源文件中的路徑幫助器方法。此文件foo.js.coffee.erb在JavaScript資源中使用Rails幫助器方法

$('#bar').val("<%= create_post_path %>") 

我會喜歡它,如果我可以從erubis

$('#bar').val("path/to/create") 
+0

你試圖做到這一點?它應該工作。 – natedavisolds

+1

是的,我試過了,它給出了「未定義的局部變量或方法」。我試過其他的方法,如... number_to_currency – axsuul

+0

我想說明的是,這種輔助方法確實工作:javscript_path('path/to/js') – axsuul

回答

68

可以包括任何幫手/模塊/類使用ERB模板:

<% environment.context_class.instance_eval { include MyHelper } %> 

見:https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rbhttps://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

要使用你必須包括您的具體應用助理的網址助手。

他們可在Rails.application.routes.url_helpers這樣:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %> 

編輯:固定鏈接到移動鏈輪回購,但真的不知道這仍然是有意義的這麼多年過去了。

+0

但是,你會如何包含UrlHelpers模塊?與此不同的是,url助手在運行時需要一個模型,buy-buy cowboy –

+14

要使用url助手,你必須包含你的特定應用程序的助手。他們可以在'Rails.application.routes.url_helpers'得到: '<%environment.context_class.instance_eval {include Rails.application.routes.url_helpers}%>' – eirc

+3

很棒的答案!你怎麼解決這個問題的?這是否出現在Rails指南中?我以爲我可能在RailsCast中看到類似的東西,這個魔法非常強大,你得告訴我一個人! – jlstr

18

讓我不太清楚,你爲什麼要這麼做。

  • 你會阻止緩存JavaScript文件,因爲它包含一個動態值

  • 你會得到你的JavaScript/CoffeeScript的之間的耦合和軌道

如果可能的話我會建議您通過在視圖中提供目標路徑來抽象出問題,並在發生特定事件時從DOM元素中檢索值。就像Rails的'Unobtrusive Scripting Adapters'一樣。例如:https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

+0

是的,謝謝你的建議。 – axsuul

+19

這不會阻止緩存。這些資產在部署時被編譯並且永不改變該路徑不會改變(除非它實際上並且資產被重新編譯),如果您想在您的'asset_path託管的JS中使用圖像路徑' – brad

+4

如上所述,我不想這樣做,因爲它會在您的應用程序和JavaScript之間引入耦合。你的應用的每個部分都應該有不同的用途。你不希望你的視圖具有模型邏輯,我個人不希望Rails代碼泄漏到我的JavaScript中。當然這是一種個人喜好。 JavaScript有多種可能性,從DOM中檢索信息而不直接注入到DOM中。你不會想要硬編碼這些值。那麼,爲什麼有一個幫手爲你做這件事更好? – topek

5

其實,不知道這是否幫助,但有一種方法來定義自己使用的助手期間rake precompile

創建一個新的初始化,並把這個在它:

module Sprockets 
    module Helpers 
    module RailsHelper 

     def my_helper_method 
     ... 
     end 

    end 
    end 
end 

而且然後您可以:

<%= my_helper_method %> 

.erb資產

25

這也將做在初始化的伎倆:

Sprockets::Context.send :include, MyHelper 

在發展方式的助手將不會在每次請求被重新加載。

你的UrlHelpers的方法將工作,直到你需要找到post_path(...um...we don't know what post id we'll need at compile time...)。有一個紅寶石寶石,它重新實現了JavaScript中的所有Rails UrlHelpers:https://github.com/railsware/js-routes

+0

這是最少侵入性的解決方案,謝謝! – Casey

+1

我不得不添加railtie到我的application.rb文件因爲我使用config.assets.initialize_on_precompile = false。https://stackoverflow.com/questions/9235292/how-can-i-run-some-initializers-when-doing-a-rails-assetsprecompile/12700183#12700183 on如何設置railtie。 – HannesBenson

+0

這對我有用,謝謝。 –

8

確實我同意@eirc的答案(考慮到Sprockets文檔)。但我會 考慮包括助手模塊在導軌啓動時。按照

# config/initializers/sprockets.rb 
Rails.application.assets.context_class.instance_eval do 
    include ActionView::Helpers 
    include Rails.application.routes.url_helpers 
    include MyModule 
end 

這是因爲:https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23