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
- вы можете сослаться на Rails Completed 406 Not Acceptable in 64ms
- welcome_controller.rb
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">