Как заставить js .erb обновить sh Ruby код - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь получить список data_file_names для моей модели XslSheet в раскрывающемся списке select в моем файле js .erb.

Я попробовал следующее при вводе. js .erb:

inputEx.registerType("button", inputEx.ButtonField, [
{
    type: "select",
    label: I18n.t('form.field.xsl'),
    name: "xsl",
    choices: <% if User.current_user %>
               <% if User.current_user.current_scope['ab'] %>
                 <%= XslSheet.where(:assetable_id=>User.current_user.current_scope['ab']).pluck(:data_file_name) %>
               <% end %>
             <% end %>,
    required: false
}], true);

Я также пытался поместить это в партиал и отобразить его:

input. js .erb:

inputEx.registerType("button", inputEx.ButtonField, [
{
    type: "select",
    label: I18n.t('form.field.xsl'),
    name: "xsl",
    choices: <%= Erubis::Eruby.new(File.read(File.join(Rails.root, 'app/views/admin/forms', '_xsl_sheet_names.html.erb'))).result(period: @period) %>,
    required: false
}], true);

_xsl_sheet_names. html .erb:

<% if User.current_user %>
  <% if User.current_user.current_scope['ab'] %>
  <%= XslSheet.where(:assetable_id=>User.current_user.current_scope['ab']).pluck(:data_file_name) %>
  <% end %>
<% end %>

Erubis должен был отобразить партиал как мой ввод. js .erb находится в папке активов.

Ни один из этих методы работы. Мне необходимо очистить папку tmp / cache, чтобы увидеть обновленные значения в select. После очистки кэша и перезагрузки страницы я могу видеть обновленные значения.

Могу ли я попробовать другие методы?

Редактировать:

Сейчас попробовал создать метод в модели XslSheet и вызвать его во входных данных. js .erb.

xsl_sheet.rb

def xsl_names
    if User.current_user 
      if User.current_user.current_scope['Application'] 
        x = XslSheet.where(:assetable_id=>User.current_user.current_scope['Application']).pluck(:data_file_name) 
        x
      end 
    end 
  end

input. js .erb

choices: <% x = XslSheet.new %>
              <%= x.xsl_names %>,

Для этого также необходимо очистить кеш перед отображением обновленных значений

1 Ответ

1 голос
/ 16 января 2020

Все в 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, по существу предоставляя аргументы через представление.

Если вы хотите узнать больше о внутренностях конвейера активов, вы можете найти их здесь .

...