Все в app/assets
должно быть указано c и будет предварительно скомпилировано только один раз на рабочем сервере (это означает, что ERB также будет выполнен один раз). Причина, по которой вы можете использовать ERB, заключается в правильной ссылке на изображения и другие файлы stati c. Они получат отпечатки пальцев, и вам нужно будет использовать помощники по активам для правильной установки URL-адресов.
Теперь перейдем к решению вашей проблемы, поскольку вы хотите иметь некоторые динамические значения c JavaScript, подумайте о /js/:file_name
маршрут, который предоставляет динамический c JavaScript.
# app/routes.rb
get '/js/:file_name', as: 'dynamic_js', to: 'javascript#show', defaults: { format: 'js' }
Теперь добавьте новый контроллер для маршрута.
# app/controllers/javascript_controller.rb
class JavascriptController < ApplicationController
FILE_PATH = "#{Rails.root}/app/views/javascript/*"
EXT_REGEX = /[.]js(?:[.]erb)?\z/
FILES = Dir[FILE_PATH].grep(EXT_REGEX).map { |file| file.sub(EXT_REGEX, '') }
def show
unless FILES.include?(params[:file_name])
raise ActiveRecord::RecordNotFound, # handled with 404 by default
"Couldn't find JavaScript with file name '#{params[:file_name]}'"
end
render params[:file_name]
end
end
Переместите файл JavaScript из
app/assets/javascripts/input.js.erb
до
app/view/javascript/input.js.erb
Последнее, что нужно сделать, это обновить использование. Поскольку вы, скорее всего, захотите использовать загруженные файлы / библиотеки stati c JavaScript, этот файл следует загружать после активов stati c JavaScript.
<%# app/views/layouts/application.html.erb %>
<!doctype html>
<head>
<%# ... %>
</head>
<body>
<%= yield # your main yield for all views %>
<%= javascript_include_tag 'application' %>
<%= yield :javascript %>
</body>
</html>
С учетом вышеизложенного Теперь можно использовать метод content_for
. Теперь вы сможете создать следующее представление.
<% content_for :javascript do %>
<%= javascript_tag '', src: dynamic_js_path('input', format: :js) %>
<% end %>
<p>Your normal view content</p>
В качестве альтернативы, если вам нужно загрузить этот специфицированный c скрипт на каждой странице, вы можете просто вставить его в app/views/layouts/application.html.erb
напрямую.
Возможно, вы захотите прочитать о , написав ненавязчиво JavaScript, то есть stati c JavaScript, который извлекает динамические данные c из элементов. Таким образом, вы можете сохранить JavaScript stati c, по существу предоставляя аргументы через представление.
Если вы хотите узнать больше о внутренностях конвейера активов, вы можете найти их здесь .