Rails Hotwire не обновляет страницу
Я знаком с ROR и хочу использовать в своем проекте новые Hotwire-Rails. Я не в порядке, когда создаю сообщения. Но когда я обновляю / удаляю сообщения, на странице ничего не происходит. Подскажите, пожалуйста, где я делаю не так? И, наконец, я хочу издать звук, когда создается новый пост, как я могу это сделать? Спасибо за ваши ответы.
мой "Gemfile"
gem 'redis', '~> 4.0'
gem 'hotwire-rails', '~> 0.1.3'
Application.js
require("@rails/ujs").start()
require("@rails/activestorage").start()
require("channels")
Application.html.erb
<body>
<%= turbo_include_tags %>
<%= yield %>
</body>
Post.rb
after_create_commit { broadcast_prepend_to "posts" }
after_update_commit { broadcast_replace_to "posts" }
after_destroy_commit { broadcast_remove_to "posts" }
posts_controller.rb
class PostsController < ApplicationController
before_action :set_post, only: %i[ show edit update destroy ]
# GET /posts or /posts.json
def index
@posts = Post.all
end
# GET /posts/1 or /posts/1.json
def show
end
# GET /posts/new
def new
@post = Post.new
end
# GET /posts/1/edit
def edit
end
# POST /posts or /posts.json
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: "Post was successfully created." }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /posts/1 or /posts/1.json
def update
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: "Post was successfully updated." }
format.json { render :show, status: :ok, location: @post }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# DELETE /posts/1 or /posts/1.json
def destroy
@post.destroy
respond_to do |format|
format.html { redirect_to posts_url, notice: "Post was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find(params[:id])
end
# Only allow a list of trusted parameters through.
def post_params
params.require(:post).permit(:title, :body)
end
end
сообщения / index.html.erb
<%= turbo_stream_from "posts" %>
<%= turbo_frame_tag "posts" do %>
<%= render @posts %>
<% end %>
posts / _post.html.erb
<%= post.title %>:
<%= post.body %>
<%= link_to 'Edit', edit_post_path(post) %> |
<%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %> <br>
2 ответа
Да, похоже, что это попытается перенаправить, чтобы вы пропустили трансляцию, которая была отправлена на страницу, в которую вам нужно что-то вставить, чтобы остановить перенаправление, которое вместо этого может быть ответом turbo_stream или изменить ответ html на визуализацию головы: ок
Вам не хватает обработчиков для
turbo_stream
формат в ваших контроллерах. Если вам нужны обновления Hotwire, вы должны добавить такой обработчик в свои методы обновления и уничтожения.
format.turbo_stream { turbo_stream.replace/append/prepend(:div_tag_identifer, "<p> Some html content you want to show </p>")
По сути, метод контроллера должен отображать Turbo-ответ, который включает изменение, которое вы хотите видеть на странице. Может быть
turbo_stream.replace(:some_div_id, "some/partial", post: @post)
для обновления, или
turbo_stream.append("some/partiall", post: @post)
для создания.