我在rails 7中有一个删除链接,可以使用turbo_stream或html正常运行,但不是每一个都可以.

link_to 'delete', @object, data: { turbo_method: 'delete', turbo_confirm: 'Really?' }

我从索引页调用此链接,它应该使用turbo_stream响应来删除记录和表行.索引页被包裹在Turbo框架标签中.我还从show页面调用此方法,其中的html响应应该删除记录并重定向回索引页.展示页面不是用Turbo框架标签包装的.

显示页面链接正确地命中销毁操作并销毁记录-但是,它不会重定向.它实际上响应了turbo_stream.如果我从销毁操作中删除了Format.turbo_stream块,那么相同的链接将正确地命中Format.html响应并重定向.同样的链接知道如何响应Format.html,但它会try 响应Format.turbo_stream,即使该链接没有被包装在turbo-Frame标签中.

在Rails7中,数据属性"turbo_method:‘Delete’"会导致一个turbo_stream调用.有没有一种方法可以告诉该链接响应Form.html?

当来自链接的传入响应是turbo_stream时,如何让显示页面上的链接响应Format.html并重定向?

推荐答案

我已经提到了headers a fewrecently次,所以我将这一部分保持简短:

当您发送TURBO_STREAM请求时,优先的第一个格式是turbo_stream.如果没有turbo_stream格式块或turbo_stream.erb模板,则使用html格式.因为turbo可以处理这两个响应,所以它设置Accept标头来确定要运行哪个格式块.你可以从destroy行动中看一看:

puts request.headers["Accept"]
#=> text/vnd.turbo-stream.html, text/html, application/xhtml+xml
#   ^                           ^
#   turbo is first in line      html is second

def destroy
  @model.destroy

  respond_to do |format|
    format.turbo_stream { render turbo_stream: turbo_stream.remove(@model) }
    format.html { redirect_to models_url, notice: "Destroyed." }
  end
end

To get a turbo_stream response

<%= link_to "Turbo destroy", model_path(model),
  data: {turbo_method: :delete}
%>

To get an html response

Rails还可以忽略Accept报头并根据URL扩展来确定格式.呼叫/models/1.html的涡轮增压请求将以html回应.

<%= link_to "HTML turbo destroy", model_path(model, format: :html),
  data: {turbo_method: :delete}
%>

<%= button_to "HTML turbo destroy", model_path(model, format: :html),
  method: :delete
%>

我最不喜欢的turbo: false个选项,讨厌:

<%= button_to "HTML rails destroy", model_path(model),
  method: :delete,
  data: {turbo: false}
%>

Use url/form params to do whatever you want

<%= button_to "Turbo destroy with params", model_path(model),
  method: :delete,
  params: {redirect_to: "/anywhere/you/like"} # or maybe just true/false
%>
def destroy
  @model.destroy

  respond_to do |format|
    # just pass a param and disable the turbo_stream block
    unless params[:redirect_to]
      format.turbo_stream { render turbo_stream: turbo_stream.remove(@model) }
    end
    format.html { redirect_to (params[:redirect_to] || models_url), notice: "Destroyed." }
  end
end

如果这仍然不能解决问题,您可以发送您自己的fetch个请求,并且只为您需要的格式设置一个Accept头.请参阅顶部的链接.

Ruby-on-rails相关问答推荐

Web控制台不会出现在例外页面Rails 7.1.1上

尽管安装并需要 pry-rails gem,但 Rails 容器内出现未定义方法‘pry’错误

如何验证 Rails 中的多态字段关联?

序列化来自关联的不可变数据是个好主意吗?

为什么 Rails 执行器不能识别内核的改进?

您如何查看在 Rails 中触发回调的关联模型?

'elseif' 还存在吗?

Rails 连接并包含连接表中的列

如何避免 activesupport 中的循环参数引用警告

如何使用 RSpec 和 Devise/CanCan 进行集成测试?

在 Rails 中找不到关联问题

SQLite3::BusyException

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

删除链接在 Rails 3 视图中发送Get而不是Delete

Rails:从视图内渲染视图(不是部分视图)

在 Rails 中复制模型实例

Rails 4 pgsql add_index 类型为 GIN 或 GiST

默认呈现 JSON 而不是 HTML?

如何在 Rails 迁移中添加一些插入?

如何从 rails 控制器操作发出 404 响应?