使用 Rails 7 中的 format.turbo_stream 时出现 ActionController::UnknownFormat。

7

嘿,我对 Turbo Streams 还很陌生,目前在遇到错误时卡住了。

属性部分:

<div id="properties"
     data-action="map-marker-clicked@window->@mapmarker#mapMarkerClicked"
     data-controller="mapmarker"
     data-mapmarker-target="properties_list">
  <%= "#{@properties.length} properties" %>

  <%= turbo_stream_from "properties" %>
  <%= turbo_frame_tag "properties" do %>
    <% @properties.each do |property| %>
      <%= render property %>
      <p>
        <%= link_to "View this property", property %>
      </p>
    <% end %>
  <% end %>
</div>

我的控制器:

  def index
    @properties = location_search? ? Property::SearchByLocation.call(search_params[:value]) : Property.all

    @markers = Property::GenerateGoogleApiMapMarkers.call(property_or_properties: @properties)

    respond_to do |format|
      format.turbo_stream do
        render turbo_stream: turbo_stream.replace(@properties, partial: 'properties/properties')
      end
    end
  end

更多背景信息:我计划从刺激控制器触发此重新加载(当用户在google地图上点击标记时,我希望使用标记的坐标来组织属性部分的刷新(最接近标记的属性将显示在顶部)。

当我访问http://localhost:3000/properties时,我遇到ActionController::UnknownFormat错误。

在这里输入图片描述


1
你解决了吗?我有完全相同的问题,还没有解决。 - David Lazar
嗨 @DavidLazar 你有没有找到解决方案? - Maxence
@Maxence,有解决方案的运气吗? - bcarp121177
@bcarp121177 对不起,我错误地存根了用户。然后 Devise 将我重定向到 GET 登录转发 .turbo_sream 格式。这导致失败。 - Maxence
4个回答

2
您需要添加一个默认的format.html操作。

0
遇到了同样的问题,通过在config/initializers/mime_type.rb中添加以下行手动注册mime类型来解决它。
Mime::Type.register "text/vnd.turbo-stream.html", :turbo_sream

请参考https://github.com/hotwired/turbo/pull/93了解一些背景信息。


Mime::Type.register "text/vnd.turbo-stream.html", :turbo_stream 命令已修复。 - Mauro

0

步骤1: 创建一个新的控制器TurboController

class TurboController < ApplicationController
  class Responder < ActionController::Responder
    def to_turbo_stream
      controller.render(options.merge(formats: :html))
    rescue ActionView::MissingTemplate => error
      if get?
        raise error
      elsif has_errors? && default_action
        render rendering_options.merge(formats: :html, status: :unprocessable_entity)
      else
        redirect_to navigation_location
      end
    end
  end
  self.responder =  Responder
  respond_to :html, :turbo_stream
end

步骤2:使用TurboController更新Devise parent_controller

文件:devise.rb,即Devise初始化器

config.parent_controller = 'TurboController'

步骤 3: 在 Devise 的 navigational_formats 中添加 turbo_stream

文件:devise.rb,即 Devise 初始化器

  config.navigational_formats = ['*/*', :html, :turbo_stream]


0
尝试在你的link_to或button_to方法中明确传递method: :get参数。
我认为这与TurboDrive以及它如何劫持请求有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接