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

7

我已经按照这个GoRails视频的指引,让Devise与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,但是在Chris的源代码中,它是beta.3,所以这似乎不是问题所在。

我错过了什么?


2
这里有同样的问题。你解决了吗? - Thomas Van Holder
@ThomasVanHolder 我刚刚更新了我的代码,现在它可以正常工作。顺便提一下,我现在使用的是 Rails 6.1.3.2,同时也安装了 hotwire-rails (0.1.3)devise (4.8.0) - Lee McAlilly
3个回答

2
我曾经遇到过同样的问题,后来发现没有触发导航。在initializers/devise.rb中将这一行附加::turbo_stream对我解决了这个问题。
Devise.setup do |config|
  [...]
  config.navigational_formats = ['*/*', :html, :turbo_stream]
  [...]
end

1
嗯...我已经在我的Devise初始化器中有了那个,所以似乎不是我的问题。希望这能很快在Devise / Rails新版本中得到解决。我预计这将是一个非常普遍的问题。 - Lee McAlilly

1
我通过将所有的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, as: resource_name, url: session_path(resource_name)) do |f| %>


0
我的解决方案是,在sign_in页面的布局中不使用app/javascript/packs/your_application.js
相反,您可以编写一个新的js文件,例如app/javascript/packs/blank.js,在这个blank.js文件中,不要添加import "@hotwired/turbo-rails"
然后,在Devise的sign_in页面中,使用blank.js文件作为新的布局文件app/views/layouts/blank.html.erb,像这样:
<head>
    <%= javascript_pack_tag 'blank' %>
    <%= stylesheet_pack_tag 'blank' %>
</head>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接