首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Hotwire不更新页面

Rails Hotwire不更新页面
EN

Stack Overflow用户
提问于 2021-02-23 17:10:48
回答 2查看 653关注 0票数 1

我熟悉ROR,我想在我的项目中使用新的Hotwire-Rails。当我创建帖子时,我不是很好。但是当我更新/删除帖子时,页面上什么也没有发生。你能告诉我我哪里做错了吗?最后,我想在创建新帖子时发出声音,我该怎么做呢?感谢您的回答。

我的"Gemfile“

代码语言:javascript
复制
gem 'redis', '~> 4.0'
gem 'hotwire-rails', '~> 0.1.3'

Application.js

代码语言:javascript
复制
require("@rails/ujs").start()
require("@rails/activestorage").start()
require("channels")

Application.html.erb

代码语言:javascript
复制
<body>
  <%= turbo_include_tags %>
  <%= yield %>
</body>

Post.rb

代码语言:javascript
复制
after_create_commit { broadcast_prepend_to "posts" }
after_update_commit { broadcast_replace_to "posts" }
after_destroy_commit { broadcast_remove_to "posts" }

posts_controller.rb

代码语言:javascript
复制
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

posts/index.html.erb

代码语言:javascript
复制
<%= turbo_stream_from "posts" %>
<%= turbo_frame_tag "posts" do %>
  <%= render @posts %>
<% end %>

posts/_post.html.erb

代码语言:javascript
复制
<%= post.title %>:
<%= post.body %> 
<%= link_to 'Edit', edit_post_path(post) %> |
<%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %> <br>
EN

回答 2

Stack Overflow用户

发布于 2021-05-17 05:57:06

您的控制器中缺少turbo_stream格式的处理程序。如果你想要hotwire更新,你必须添加一个像这样的处理程序到你的更新和销毁方法中。

代码语言:javascript
复制
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)

票数 0
EN

Stack Overflow用户

发布于 2021-11-11 18:19:17

是的,看起来这将尝试重定向,所以您将错过发送给页面的广播。您需要放入一些内容来停止重定向,这可能是turbo_stream响应,或者将html响应更改为render head :ok

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66330153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档