使用 Hotwire 时如何显示 Devise 登录表单错误 Rails

How to display Devise login form errors when using Hotwire Rails

followed this GoRails video to get Devise working with hotwire-rails。我不知道为什么我的登录错误消息与视频中的方式不一样。错误消息在注册表单上运行良好,但在登录表单上出现此错误:

Processing by Devise::SessionsController#create as TURBO_STREAM
Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"elvis@example.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
Completed 401 Unauthorized in 2ms (ActiveRecord: 0.0ms | Allocations: 406)

正如 Chris 在视频中所建议的那样,我已将我的 Devise 初始值设定项编辑为 this

我的 package.json 有 @hotwired/turbo-rails": "^7.0.0-beta.5,但在克里斯的剧集源代码中它是 beta.3,所以这似乎不是问题所在。

我在这里错过了什么?

我遇到了同样的问题,结果发现没有导航触发器。将 :turbo_stream 附加到 initializers/devise.rb 中的这一行为我解决了它:

Devise.setup do |config|
  [...]
  config.navigational_formats = ['*/*', :html, :turbo_stream]
  [...]
end

我通过将我所有的 flash 错误/通知统一为一个部分而不是将 flash 通知部分和一个单独的表单错误块来实现这一点:

我把这个放在我的 layouts/application.rb:

<%= render "shared/notices" %>

部分看起来像这样:

<% flash.each do |msg_type, message| %>
  <div class="alert">
    <div class="container">
      <button class="close" data-dismiss="alert"><span>×</span></button>
      <%= message %>
    </div>
  </div>
<% end %>

然后,我在 views/devise/sessions/new.html.erb 中的 form_for 看起来像这样: <%= form_for(资源, 如: resource_name, url: session_path(resource_name)) do |f| %>

我的解决方案是,您不要在 sign_in 页面的布局中使用 app/javascript/packs/your_application.js

相反,你可以像app/javascript/packs/blank.js那样写一个新的js,在这个blank.js中,不要添加import "@hotwired/turbo-rails"

并在 Devise sign_in 页面中使用新布局文件 app/views/layouts/blank.html.erb 中的 blank.js ,像这样:

<head>
    <%= javascript_pack_tag 'blank' %>
    <%= stylesheet_pack_tag 'blank' %>
</head>