У меня есть модель с несколькими логическими столбцами. Я хотел бы отредактировать их как флажки в форме с мгновенным обновлением при каждом нажатии флажка. Мне удалось сделать это с помощью onchange: "this.form.requestSubmit()"
для каждого флажка, а затем отобразить форму в контроллере с помощью render :edit, status: :ok
, чтобы мы остались в форме.
Теперь я хочу показать пример того, что модель делает на странице, но (я думаю), поскольку этот пример не является частью модели, элемент не обновляется. Я использовал регистратор, чтобы распечатать значение примера, и вижу, что оно меняется в выходных данных регистратора, но не вижу, чтобы оно изменилось на странице.
В приведенных ниже примерах я удалил обработку ошибок формы, чтобы сделать код короче.
вид
<div><%= @sample_invoice_number_format %></div>
<%= render "form", invoice_number_format: @invoice_number_format %>
формировать частичный
<%= form_with model: invoice_number_format do |form| %>
<div>
<%= form.label :yyyy %>
<%= form.check_box :yyyy, onchange: "this.form.requestSubmit()" %>
</div>
<div>
<%= form.label :yy %>
<%= form.check_box :yy, onchange: "this.form.requestSubmit()" %>
</div>
<div>
<%= form.label :mm %>
<%= form.check_box :mm, onchange: "this.form.requestSubmit()" %>
<% end %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
контроллер
def update
if @invoice_number_format.update(invoice_number_format_params)
sample_invoice_number_format # this updates @sample_invoice_number_format
logger.warn(@sample_invoice_number_format) # this shows the changed value
render :edit, status: :ok
else
render :edit, status: :unprocessable_entity
end
end
Спасибо. Это пригодится, чтобы лучше понять турбопотоки. На данный момент ответ ниже работает прекрасно.
При рендеринге страница не обновляется, вам необходимо перенаправить при успешной отправке:
# render :edit, status: :ok
redirect_to edit_invoice_number_format_url(@invoice_number_format)
https://turbo.hotwired.dev/handbook/drive#redirecting-after-a-form-submission
Вы также можете ответить турбопотоком и обновить определенную часть страницы:
<div id = "invoice_format">
<%= @sample_invoice_number_format %>
</div>
<%= render "form", invoice_number_format: @invoice_number_format %>
def update
respond_to do |format|
if @invoice_number_format.update(invoice_number_format_params)
format.turbo_stream do
sample_invoice_number_format
render turbo_stream: turbo_stream.update("invoice_format", @sample_invoice_number_format)
end
else
render :edit, status: :unprocessable_entity
end
end
end
Круто, работает идеально. На данный момент я выбрал рендеринг турбо-потока.