在我正在构建的应用程序中,当用户点击“回复”部分时,他们将被重定向到“显示”页面,看起来像这样:
<%= link_to tweet_path(tweet_presenter.tweet), class: "text-decoration-none text-black replies" do %>
<%= image_tag "speech.png", size: "20x20", class: "me-1" %>
<span>Replies<span>
<% end %>
...并形成视图部分(_tweet.html.erb)的一部分,该视图部分包含在turbo_frame中,该turbo_frame打开为:<%= turbo_frame_tag dom_id(tweet_presenter.tweet) do %>
然而,重定向并没有发生。相反,我得到了以下错误消息:Uncaught (in promise) Error: the response (200) did not contain the expected <turbo-frame id=“tweet_1” and will be ignored…
我已经通过运行rails routes
检查了link_to tweet_path(tweet_presenter.tweet)
路径是否正确,并获得以下结果:tweet GET /tweets/:id(.:format) tweets#show
控制台的输出显示正在访问正确的tweet_id,尽管错误消息是:
Started GET "/tweets/1" for ::1 at 2023-04-10 15:53:46 -0700
Processing by TweetsController#show as HTML
Parameters: {"id"=>"1"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/application_controller.rb:2:in `block in <class:ApplicationController>'
Tweet Load (0.3ms) SELECT "tweets".* FROM "tweets" WHERE "tweets"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/tweets_controller.rb:5:in `show'
Rendering layout /Users/doracobian/.rvm/gems/ruby-3.1.1/gems/turbo-rails-1.4.0/app/views/layouts/turbo_rails/frame.html.erb
Rendering tweets/show.html.erb within layouts/turbo_rails/frame
Rendered tweets/show.html.erb within layouts/turbo_rails/frame (Duration: 44.9ms | Allocations: 762)
Rendered layout /Users/doracobian/.rvm/gems/ruby-3.1.1/gems/turbo-rails-1.4.0/app/views/layouts/turbo_rails/frame.html.erb (Duration: 46.0ms | Allocations: 853)
Completed 200 OK in 52ms (Views: 46.8ms | ActiveRecord: 0.5ms | Allocations: 2490)
...查看开发人员工具中的“元素”,我再次看到turbo-frame#tweet_1
,与错误消息告诉我的内容相矛盾。
怎么回事?我一直在绕圈子想弄明白。
对于那些不辞辛劳地研究我这个困惑的人来说,下面是routes.rb的相关部分:
resources :tweets, only: [:show, :create] do
resources :likes, only: [:create, :destroy]
resources :bookmarks, only: [:create, :destroy]
resources :retweets, only: [:create, :destroy]
end
... tweets_controller.rb的“show”部分:
def show
@tweet = Tweet.find(params[:id])
end
非常感谢任何关于这方面的投入。
1条答案
按热度按时间bqucvtff1#
帧总是会在那里,不管你得到什么作为响应。如果有一个帧与相同的
id
在响应中比它将被更新,如果不是,你会得到帧丢失错误。要查看你实际上得到的响应,你必须看看网络选项卡:https://stackoverflow.com/a/75916578/207090
如果你在索引页上有这个,请先说明一下:
然后,您需要在请求或重定向到的页面上使用相同的框架:
据我所知,你的turbo帧是在
_tweet.html.erb
部分,我没有看到部分被渲染从你的show
页面。这是我的tweetster克隆。在一个框架中从索引页面创建新的tweet,然后用turbo流插入新创建的tweet。回复和回复上的回复也是一样的,它永远有效。
也有这么多的方法来设置这个,这只是一个想到的。
你几乎可以忽略这个控制器,我只在
create
中添加了reply
action和turbo_stream
format,因为在tweet创建之后,我们就完成了框架,我们必须从它中进行大的逃脱:这可能是你需要在框架之外做事情的主要部分,也许用不同的框架替换框架,也许在某个地方附加一个闪光灯警报,等等:
如果你想“只是”重定向出框架:
https://stackoverflow.com/a/75750578/207090