有什麼方法可以使用Rails幫助器方法,更具體地說,是一個JavaScript資源文件中的路徑幫助器方法。此文件foo.js.coffee.erb
在JavaScript資源中使用Rails幫助器方法
$('#bar').val("<%= create_post_path %>")
我會喜歡它,如果我可以從erubis
$('#bar').val("path/to/create")
有什麼方法可以使用Rails幫助器方法,更具體地說,是一個JavaScript資源文件中的路徑幫助器方法。此文件foo.js.coffee.erb
在JavaScript資源中使用Rails幫助器方法
$('#bar').val("<%= create_post_path %>")
我會喜歡它,如果我可以從erubis
$('#bar').val("path/to/create")
可以包括任何幫手/模塊/類使用ERB模板:
<% environment.context_class.instance_eval { include MyHelper } %>
見:https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb和https://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 } %>
編輯:固定鏈接到移動鏈輪回購,但真的不知道這仍然是有意義的這麼多年過去了。
但是,你會如何包含UrlHelpers模塊?與此不同的是,url助手在運行時需要一個模型,buy-buy cowboy –
要使用url助手,你必須包含你的特定應用程序的助手。他們可以在'Rails.application.routes.url_helpers'得到: '<%environment.context_class.instance_eval {include Rails.application.routes.url_helpers}%>' – eirc
很棒的答案!你怎麼解決這個問題的?這是否出現在Rails指南中?我以爲我可能在RailsCast中看到類似的東西,這個魔法非常強大,你得告訴我一個人! – jlstr
讓我不太清楚,你爲什麼要這麼做。
你會阻止緩存JavaScript文件,因爲它包含一個動態值
你會得到你的JavaScript/CoffeeScript的之間的耦合和軌道
如果可能的話我會建議您通過在視圖中提供目標路徑來抽象出問題,並在發生特定事件時從DOM元素中檢索值。就像Rails的'Unobtrusive Scripting Adapters'一樣。例如:https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173
是的,謝謝你的建議。 – axsuul
這不會阻止緩存。這些資產在部署時被編譯並且永不改變該路徑不會改變(除非它實際上並且資產被重新編譯),如果您想在您的'asset_path託管的JS中使用圖像路徑' – brad
如上所述,我不想這樣做,因爲它會在您的應用程序和JavaScript之間引入耦合。你的應用的每個部分都應該有不同的用途。你不希望你的視圖具有模型邏輯,我個人不希望Rails代碼泄漏到我的JavaScript中。當然這是一種個人喜好。 JavaScript有多種可能性,從DOM中檢索信息而不直接注入到DOM中。你不會想要硬編碼這些值。那麼,爲什麼有一個幫手爲你做這件事更好? – topek
其實,不知道這是否幫助,但有一種方法來定義自己使用的助手期間rake precompile
創建一個新的初始化,並把這個在它:
module Sprockets
module Helpers
module RailsHelper
def my_helper_method
...
end
end
end
end
而且然後您可以:
<%= my_helper_method %>
在.erb
資產
這也將做在初始化的伎倆:
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
這是最少侵入性的解決方案,謝謝! – Casey
我不得不添加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
這對我有用,謝謝。 –
確實我同意@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
你試圖做到這一點?它應該工作。 – natedavisolds
是的,我試過了,它給出了「未定義的局部變量或方法」。我試過其他的方法,如... number_to_currency – axsuul
我想說明的是,這種輔助方法確實工作:javscript_path('path/to/js') – axsuul