我们目前正在将我们的应用程序从Vue.js转移到hotire.当使用Turbo_frames和View Components时,我们遇到了一个非常奇怪的错误.

我们有一个用于聊天中消息列表的rio_frame_tag,然后是一个单独的表单,该表单点击控制器创建新消息,然后重新呈现MessagesComponents.

我们遇到的错误是,没有替换原始rio_framework的内容,而是渲染了新的rio_framework(更重要的是,它在文档的根目录中渲染,甚至不在正确的组件中.)

我已经判断了涡轮_帧id,它们都是正确的.?

版本 铁轨:7.1.3 涡轮轨:2.0.1

消息_组件.html.erb

<%= tag.turbo_frame(id: "some_id") do %>
  <div class="space-y-3">
    <% messages.each do |message| %>
      <%= render Atoms::MessageComponent.new(message:) %>
    <% end %>
  </div>
<% end %>

new_Message_component.html.erb

<%= form_with(model: new_message, data: {turbo_frame: "some_id"}) do |f|%>. 
  <%= f.label :message%>
  <%= f.hidden_field :owner_id, value: owner.id %>
  <%= f.text_field :content %>
  <%= f.submit "Send Message" %>
<% end %>

Messages.Controler.rb#创建

def create
  message = current_user.messages.create(message_params)
  render Atoms::MessagesComponent.new(messages: messages.owner.messages)
end

我判断了请求类型,是text/vnd.turbo-stream.html. 我还验证了我们的页面上只有id some_id的元素.

我们将不胜感激.

最新消息: 再补充一点,我现在注意到新渲染的组件不在html body标签内,这超级奇怪.

推荐答案

响应必须是HTML.text/vnd.turbo-stream.html格式用于涡轮流.当您提交表格时,您可以使用涡轮流或html进行回复,请注意ACCEPT标题:

request.accept
#=> "text/vnd.turbo-stream.html, text/html, application/xhtml+xml" 
#    ^                           ^
#    `- TURBO_STREAM             `- HTML

通常,当您呈现模板或部分内容(从扩展名turbo_stream.erbhtml.erb推断)时,rails足够智能,可以为您的响应设置正确的内容类型.当您渲染一个组件时,逻辑不会执行,最终会以TURBO_STREAM格式响应,但您不会发回<turbo-stream>.

您必须使用respond_to块或显式设置content_type:

def create
  message = current_user.messages.create(message_params)

  respond_to do |format|
    format.html { render Atoms::MessagesComponent.new(messages: messages.owner.messages) }
  end

  # or

  render Atoms::MessagesComponent.new(messages: messages.owner.messages), content_type: "text/html"
end

新渲染的组件不在html body标签内

这是涡轮流行为,流被附加在文档的结尾,然后它们被任何涡轮流观察者拾取并进行处理,因为您的响应中没有<turbo-stream>标签,所以什么也不会发生:

100

Ruby-on-rails相关问答推荐

在Ruby on Rails中获取堆栈级别太深错误(&Q)

错误AESGCMOpen获取密码:消息身份验证失败:Golang解密GCM

如何为 I18n 设置 raise_on_missing_translations

正确更新其他列的更新列

带有 simple_form 的按钮内的 HTML 代码

attr_accessible(*attributes) 和 attr_protected(*attributes) 有什么区别?

I18n 用于特定于模型的 Rails 提交按钮

理解 Gemfile.lock:删除 Gemfile.lock 然后再次运行 bundle install 可以吗?

如何为 Rails SimpleForm Select 框设置默认 Select 值

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

如何在 Linux 上使用 Ruby 2.0 改进独角兽进程之间的内存共享

Rails 助手应该假设实例变量存在还是应该将它们作为参数接收?

为什么 respond_with 被从 rails 4.2 移除到它自己的 gem 中?

在 factory_girl 中填充与 children 的关联

Rspec 与 TestUnit

如何将变量 link_to 定义为外部 URL

Rails 生成 has_many 关联

find、where 和 find_by_id 有什么区别?

Ruby 1.9.2 和 Rails 3 无法打开 rails 控制台

Rails:如何在rails中使用dependent::destroy?