rails turbo_stream не работает с приложением rails 7

Я пытаюсь отправить форму и вернуть turbo_stream в приложении rails 7.0. В моей форме у меня есть следующее.

       <%= form_with url: "/request_trial", method: :post, format: :turbo_stream do |form| %>
  <%= form.label :name, I18n.t('marketing.form.name'), class: 'form-label required' %>
  <%= form.text_field :name, class:"form-control", required: true %>

  <%= form.submit I18n.t('marketing.form.send'), class: 'btn btn-trial'  %>
<% end %>

В моем контроллере у меня есть следующее

      respond_to do |format|
  format.turbo_stream do |format|
    render turbo_stream: turbo_stream.replace(:'marketing-request-trial-form',
                                              partial: 'marketing/request_trial')
  end
end

Это дает мне ошибку ActionController::UnknownFormat

Хотя у меня есть формат, указанный в моей форме, кажется, что формат htmlкогда я отправляю форму.

Я вижу, откуда это берется, в заголовках моих запросов у меня есть следующее

      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Мне нужно добавить в заголовок запроса text/vnd.turbo-stream.htmlтипа, как я могу это сделать?

2 ответа

  • вам нужно выделить тип формата
      format.turbo_stream do
   render turbo_stream: turbo_stream.replace(@article, partial: 'welcome/form')
end
      class WelcomeController < ApplicationController

  def index
    @article = Article.first
  end

  def update_article
    @article = Article.find(article_params[:id])
    respond_to do |format|
      if @article.update(article_params)
        format.turbo_stream do
          render turbo_stream: turbo_stream.replace(@article, partial: 'welcome/form')
        end
      end

    end
  end

  def article_params
    params.require(:article).permit(:id,:title, :body)
  end
end
  • index.html.erb
      <h1>Welcome ! This is a tutorial about Rails forms</h1>
<%= turbo_frame_tag dom_id(@article) do %>
  <%= form_with  model: @article, url: update_article_path, method: :post, format: :turbo_stream do |form| %>
    <%= form.text_field :id %>
    <%= form.text_field :title %>
    <%= form.text_field :body %>
    <%= form.submit "Update" %>
  <% end %>
<% end %>
  • _form.html.erb
      <%= turbo_frame_tag dom_id(@article) do %>
  <h1>New Book</h1>
  <div class="card card-body">
    <label>title</label>
    <input value="<%= @article.title %>">
  </div>
<% end %>
  • схема.rb
      ActiveRecord::Schema[7.0].define(version: 2022_02_16_084944) do
  create_table "articles", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

Причина, по которой вы получили ActionController::UnknownFormatИсключением является то, что вы отвечаете только в формате turbo_stream, но фактическим форматом является HTML(вы не передали правильный формат).

Решение 1

format: :turbo_streamпредполагается, что он передается как аргумент помощникам URL, а не помощникам формы. Например:

      some_url_helper_path(format: :turbo_stream)

В вашем буквальном случае URL должно быть:

      <%= form_with url: "/request_trial.turbo_stream", method: :post do |form| %>

Решение 2

Решение 1 может заставить контроллер правильно реагировать на turbo_stream. Но из-за ошибки вы можете видеть turbo_stream как обычный текст вместо замены представлений. Перед выпуском новой версии Turbo js вы можете добавить скрытое поле в формы вручную:

      <input type="hidden" name="format" value="turbo_stream">
Другие вопросы по тегам