Rails和webpacker:在Rails操作中访问Javascript模块(show.js.erb)
我正在运行一个从Rails 5.2转换为Rails 6的应用程序,我正在尝试将JS从资产管道转换为webpacker 我通过webpacker使用Rails UJS来执行远程AJAX请求,这些请求应该接收并执行从服务器返回的javascript代码 发件人: 注意respond_to block:中的format.js,它允许 控制器来响应您的Ajax请求。那你就有一个 生成的相应app/views/users/create.js.erb视图文件 将在服务器上发送和执行的实际JavaScript代码 客户端Rails和webpacker:在Rails操作中访问Javascript模块(show.js.erb),javascript,ruby-on-rails,webpack,Javascript,Ruby On Rails,Webpack,我正在运行一个从Rails 5.2转换为Rails 6的应用程序,我正在尝试将JS从资产管道转换为webpacker 我通过webpacker使用Rails UJS来执行远程AJAX请求,这些请求应该接收并执行从服务器返回的javascript代码 发件人: 注意respond_to block:中的format.js,它允许 控制器来响应您的Ajax请求。那你就有一个 生成的相应app/views/users/create.js.erb视图文件 将在服务器上发送和执行的实际JavaScript
$(“”)。附加到(“用户”)代码>
这就是我设置它的方式
# app/views/users/index.html.erb
<%= link_to "New", new_user_path, remote: true %>
如何继续遵循Rails边缘指南中的示例代码?在本例中使用webpacker和模块似乎打破了这个示例
我已经能够通过从服务器执行vanilla JS来解决部分用例,因此不需要定义我的对话框类
# app/views/users/new.js.erb
document.body.appendChild(
document.createRange().createContextualFragment("<%=j render 'form' %>")
)
#app/views/users/new.js.erb
document.body.appendChild(
document.createRange().createContextualFragment(“”)
)
但即便如此,我还是希望创建某种实用程序类来抽象并将其缩短为:
Util.appendToBody("<%=j render 'form' %>")
Util.appendToBody(“”)
这正是我开始的地方,试图访问一个不可访问的Util
类,因为它在es6模块中的作用域中。这是一个延伸,但您找到了这样做的方法吗?我也想做同样的事情。好吧,没有办法,但我想我会问的,以防万一。@dkniffin:我的解决方案是让全局JS类附加到窗口对象:从“classes/global”导入全局window.global=global
。这允许我在我的js.erb
文件中引用Global.someMethod()
。所以从技术上说“不”,我没有找到一个干净的ES6模块解决方案,但这个全局解决方案对我来说很好。我不认为当代码需要相互交流时,绝对模块化是一种好处。我相信这就是您所寻找的
# app/javascript/packs/application.js
import Dialog from "dialog"
# app/javascript/dialog.js
export default class Dialog {
static showDialog(html) {
...JS to create and append element to body then show, etc...
}
}
# config/webpack/environment.js
const { environment } = require("@rails/webpacker")
const webpack = require("webpack")
// Put into global namespace instead of importing in every file you use it.
environment.plugins.prepend("Provide",
new webpack.ProvidePlugin({
Rails: ["@rails/ujs"],
$: "jquery",
jQuery: "jquery"
})
)
# app/views/users/new.js.erb
document.body.appendChild(
document.createRange().createContextualFragment("<%=j render 'form' %>")
)
Util.appendToBody("<%=j render 'form' %>")