gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:04:26 25 4
gpt4 key购买 nike

我正在尝试将 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);

我还尝试将其放入部分并渲染它:

输入.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 需要渲染部分,因为我的 input.js.erb 位于 Assets 文件夹中。

这两种方法都不起作用。我需要清除 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

输入.js.erb

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

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

最佳答案

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

现在来解决您的问题,因为您想要一些动态 JavaScript,请考虑创建一个提供动态 JavaScript 的 /js/:file_name 路由。

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

现在为路线添加一个新 Controller 。

# 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

最后要做的就是更新用法。由于您很可能希望使用加载的静态 JavaScript 文件/库,因此应在静态 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方法。您现在应该能够创建以下 View 。

<% 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 中。

您可能还想阅读 writing unobtrusive JavaScript ,这是从元素中提取动态数据的静态 JavaScript。这样您就可以保持 JavaScript 静态,同时实质上通过 View 提供参数。

如果你想了解更多关于 Assets 管道的内部原理,可以找到here .

关于javascript - 如何强制 js.erb 刷新 Ruby 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59766854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com