Rails 7中无需提交表单,用下拉框刷新Turbo Frames的问题
解决Turbo场景下set_property_transaction动作的406错误
核心原因
406错误本质是请求期望的响应格式(JSON/JS)和控制器实际能返回的格式不匹配——哪怕你有模板,只要没明确指定响应HTML,Rails就会判定找不到对应格式的模板。
具体解决方案
修正控制器响应格式
在PropertiesController的set_property_transaction动作里明确指定响应HTML格式(Turbo Frames/Streams依赖HTML片段渲染):def set_property_transaction # 你的业务逻辑:比如根据参数获取对应字段数据 @transaction_type = params[:property_transaction] respond_to do |format| format.html # 明确响应HTML,匹配你的erb模板 end end或者更简洁的写法:
def set_property_transaction @transaction_type = params[:property_transaction] render formats: :html end调整请求的Accept头
如果是用Stimulus发起请求,确保请求头Accept设置为text/html,而非默认的JSON:// property_transaction_controller.js import { Controller } from "@hotwired/stimulus" export default class extends Controller { selectTransaction() { const transactionValue = this.element.value const formData = new FormData() formData.append('property_transaction', transactionValue) fetch('/set_property_transaction', { method: 'POST', headers: { 'Accept': 'text/html', // 关键:告诉服务器返回HTML格式 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content }, body: formData }) .then(response => response.text()) .then(html => { // 用Turbo更新对应DOM元素或Frame document.getElementById('transaction-fields').innerHTML = html }) } }验证模板位置与命名
确认模板文件set_property_transaction.html.erb(或对应的局部模板)放在app/views/properties/目录下,文件名拼写完全一致、无大小写错误。如果渲染的是局部模板,需在控制器里明确指定:render partial: 'property_transactions', formats: :html检查路由配置
确保路由没有限制请求格式,避免写成:post '/set_property_transaction', to: 'properties#set_property_transaction', format: :json正确的路由应允许HTML格式:
post '/set_property_transaction', to: 'properties#set_property_transaction'
内容的提问来源于stack exchange,提问作者Manuel Santiago Yépez
相关产品推荐
相关产品推荐

