将导入地图和刺激与 Rails 6 结合使用

AdC*_*vin 11 javascript stimulusjs ruby-on-rails-6 import-maps ruby-on-rails-7

我目前使用的是 Rails 6.0.4,我想使用 Stimulus 构建一个新页面。在升级到 Rails 7 之前还有很多工作要做,因此如果可能的话,我想在 Rails 6 中使用导入映射和刺激。但到目前为止我还无法让刺激控制器工作。我按照以下步骤操作:

1. 更新 Gemfile 和包:

gem 'importmap-rails'
gem 'stimulus-rails'
Run Code Online (Sandbox Code Playgroud)

2. 跑步rails importmap:install

这给了我config/importmap.rb, 和app/javascript/application.js,它在配置文件中被固定为“应用程序”。

3. 重命名当前application.js文件

我的电流application.js在 inside ,所以我暂时app/assets/application.js.coffee将其重命名为并更新为以下内容:old_application.js.coffeeapplication.html.haml

= javascript_include_tag "old_application", defer: true
= javascript_importmap_tags
Run Code Online (Sandbox Code Playgroud)

这似乎有效,当我渲染页面时,它给了我以下导入映射:

{
  "imports": {
    "application": "/assets/application-920fceca960b509c1e98c9b27d167fa368d4b588ceb1be42d1667552714f94d5.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

4.运行rails stimulus:install

这给了我里面app/javascript/controllersindex.js,application.js和的文件夹hello_controller.js

它还更新config/importmap.rb为以下内容:

pin "application", preload: true
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"
Run Code Online (Sandbox Code Playgroud)

...以及我的app/javascript/application.js以下内容:

import "controllers"
Run Code Online (Sandbox Code Playgroud)

然后这给了我一个错误,说controllers/hello_controller.js尚未预编译:

资产未预编译错误

5.更新资源路径和预编译文件

我们使用的是 sprocket 的版本 3,由于这个问题,升级到版本 4 也需要一些时间。因此,我更新了现有initializers/assets.rb文件以包含新的 javascript 文件夹和文件:

Rails.application.config.assets.paths << Rails.root.join('app', 'javascript', 'controllers')
Rails.application.config.assets.precompile += ['application.js', 'controllers/index.js', 'controllers/application.js', 'controllers/hello_controller.js']
Run Code Online (Sandbox Code Playgroud)

这解决了问题并在渲染页面上提供了以下导入映射:

{
  "imports": {
    "application": "/assets/application-920fceca960b509c1e98c9b27d167fa368d4b588ceb1be42d1667552714f94d5.js",
    "@hotwired/stimulus": "/assets/stimulus.min-c5a29ae8ade968ede2149a7e76a29d0756a87cef66959113681098e5923ba26b.js",
    "@hotwired/stimulus-loading": "/assets/stimulus-loading-6b29b7e0382bd421ac62df99b46f45072fd3962208fbf0b2522041b4d037bbd9.js",
    "controllers/hello_controller": "/assets/hello_controller-8cddac086717993eeda2cc8af3be73bc3a6ecfb07212600aeed8ce8122fffa34.js",
    "controllers": "/assets/index-7445df4dc00776a5e3496034da4bc5906891c342c89c0e6a7775b1498b8222d8.js",
    "controllers/application": "/assets/application-5703baa647baaa5a3da21d4e61aa5686824d0e0ab82c2ba11f5c963cc8414a8f.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

6. 用警报测试刺激控制器

我更改hello_controller.js为在连接时显示警报:

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  connect() {
    alert('Hello World!')
  }
}

Run Code Online (Sandbox Code Playgroud)

但是,当我将其附加到一个元素时,data-controller="hello"我看不到任何东西,这表明刺激尚未正确加载。

这是部分内容:

.home-container{data: { controller: 'hello' }}
  %section
    .container
Run Code Online (Sandbox Code Playgroud)

这给了我这个 HTML:

<div class="home-container" data-controller="hello">
  <section>
    <div class="container">
    </div>
  </section>
<div>
Run Code Online (Sandbox Code Playgroud)

谁能建议我可能缺少什么?如果我在 Rails 7 上启动一个新的 Rails 应用程序并像这样设置所有内容,它就可以正常工作。

bun*_*ufi 7

我遇到了同样的问题。运行rails assets:cleanrails assets:clobber为我解决了问题。抱歉,我不记得是哪一个成功了,因为我正在应用无能的狗方法。