如何强制js.erb刷新Ruby代码

问题描述 投票:0回答:1

我正在尝试将XslSheet模型的data_file_names列表放入js.erb文件的select下拉列表中。

我已经在input.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 %>

由于我的input.js.erb在assets文件夹中,因此需要Erubis来渲染部分图像。

这些方法都不起作用。我需要清除tmp / cache文件夹才能在选择中查看更新的值。清除缓存并重新加载页面后,就可以看到更新的值。

还有其他可以尝试的方法吗?

编辑:

现在尝试在XslSheet模型中创建一个方法,并在input.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 %>,

这还要求在显示更新的值之前清除缓存

javascript ruby-on-rails ruby asset-pipeline erb
1个回答
0
投票

app/assets中的所有内容都应该是静态的,并且只会在生产服务器上预编译一次(这意味着ERB也将执行一次)。完全可以使用ERB的原因是为了正确链接到图像和其他静态文件。他们将获得指纹,并且您需要使用资产助手来正确设置URL。

现在解决您的问题,因为您要使用一些动态JavaScript,请考虑制作一个提供动态JavaScript的/js/:file_name路由。

# app/routes.rb
get '/js/:file_name', as: 'dynamic_js', to: 'javascript#show', defaults: { format: 'js' }

现在为路由添加新的控制器。

# app/controllers/javascript_controller.rb
class JavascriptController < ApplicationController
  def show
    render params[:file_name]
  end
end

从以下位置移动JavaScript文件

app/assets/javascripts/input.js.erb

to

app/view/javascript/input.js.erb

最后要做的就是更新用法。由于您很可能想利用已加载的静态JavaScript文件/库,因此应在静态JavaScript资产之后加载此文件。

<%# app/views/layouts/application.html.erb %>
<%# ... %>

<body>
  <div id="content">
    <%= yield # your main yield for all views %>
  </div>

  <%= javascript_include_tag 'application' %>
  <%= yield :javascript %>
</body>

使用以上方法,您现在可以使用content_for方法。您现在应该可以创建以下视图。

content_for

或者,如果需要在每个页面上加载此特定脚本,则可以直接将其插入<% content_for :javascript do %> <%= javascript_tag '', src: dynamic_js_path('input', format: :js) %> <% end %> <p>Your normal view content</p>

您可能还想读一下app/views/layouts/application.html.erb,它是从元素中提取动态数据的静态JavaScript。这样,您可以使JavaScript保持静态,同时实质上通过视图提供参数。

如果您想进一步了解资产管道的内部结构,可以找到它们writing unobtrusive JavaScript

© www.soinside.com 2019 - 2024. All rights reserved.