Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails和webpacker:在Rails操作中访问Javascript模块(show.js.erb)_Javascript_Ruby On Rails_Webpack - Fatal编程技术网

Rails和webpacker:在Rails操作中访问Javascript模块(show.js.erb)

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

我正在运行一个从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' %>")