我有一个带有 Select 标记的表单.SELECT的选项是练习列表,值是id.

当标签的值改变时,我想使用刺激控制器用来自路径/exercises/[id]的响应来更新加速帧.

exercises#show动作同时响应html和turbo_stream

exercises_controller.rb

respond_to do |format|
    format.html
    format.turbo_stream
end

show.html.erb

<h1>This is the html template</h1>

show.turbo_stream.erb

<%= turbo_stream.update 'exercise_details', partial: 'exercises/history' %>

exercises/_history.html.erb

<h1>This is the turbo template</h1>

history_controller.js

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {

  connect() {
  }

  change(event) {
    let frame = document.getElementById('exercise_details')
    frame.src = "/exercises/" + event.currentTarget.value
    frame.reload()
  }
}

框架在更改时会按照预期进行更新,但使用的是html模板,而不是turbo模板.

如何使用turbo模板更新框架?

推荐答案

有两种方法可以做到这一点.设置.turbo_stream url扩展名:

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  change(event) {
    const frame = document.getElementById("exercise_details")
    frame.src = "/exercises/" + event.currentTarget.value + ".turbo_stream"
    // frame.reload(); // there is no need to reload
  }
}

或者发送您自己的Turbo流fetch请求,您不需要Turbo帧来执行此操作:

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  change(event) {
    const url = "/exercises/" + event.currentTarget.value
    fetch(url, {
      headers: {
        "X-CSRF-Token": document.querySelector("[name='csrf-token']").content,
        "Accept": "text/vnd.turbo-stream.html"
      }
    })
      .then(response => response.text())
      .then(text => Turbo.renderStreamMessage(text));
  }
}

Ruby-on-rails相关问答推荐

如何在rails 7中禁用Simple_Form验证

Rails7--如何使用内联代码仅为操作运行BEFORE操作

在URL中将下划线更改为连字符Ruby on Rails

Rails 7.1,登录到STDOUT和LOG/Production.log

使用Rails和RSpec,有没有办法查看操作真正将您带到哪个页面?

Rails 7 共享刺激控制器功能

键入rails 控制台无法启动?

Devise + Omniauth - 如何传递额外的参数?

如何在 YAML 中声明带有单引号和双引号的字符串?

如何在 Rails 中使用 instance_eval 子句删除验证?

如何在rails中发回js.haml

如何在 Rails 迁移中添加判断约束?

Rails:文件路径

使用 RSpec 2 关闭一个规范的事务性固定装置

在 PostgreSQL 中强制字符串的最大长度

我收到在扫描下一个令牌时发现无法启动任何令牌的字符

表单中的第一个参数不能包含 nil 或为空 - Rails 4

Rails 4模块的未初始化常量

Heroku - 在浏览器中显示当前提交的哈希

在 Rails 4.1 中,如何通过枚举符号查找记录?