我正在尝试将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 %>,
这还要求在显示更新的值之前清除缓存
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。