如何在 Rails 7 和 Turbo Stream 中使用 Devise Invitable

How to use Devise Invitable with Rails 7 and Turbo Stream

提问人:don_Bigote 提问时间:3/29/2023 更新时间:4/1/2023 访问量:272

问:

我有一个带有 Devise 4.9 和 Devise Invitable 2.0.7 的 Rails 7 应用程序。

在我把这个navigational_formats设置为:initializers/devise.rb

config.navigational_formats = ['*/*', :html, :turbo_stream]

这允许设计表单正常工作。

但是,此配置会破坏设计邀请表单,例如: 此表格具有app/views/devise/invitations/new.html.erb

<%= form_for(resource, as: resource_name, url: invitation_path(resource_name), html: { method: :post }) do |f| %>

如果我尝试提交此表单,则会出现以下错误:

undefined method `users_url' for #<Users::InvitationsController:0x00000000050dc0>

如果我将其添加到我的路线中

resources :users

然后,当我提交表单时,我收到此错误:

undefined method `empty?' for #<User id: nil,  ...

如果我添加到邀请的form_for,那么表单将提交,但它不适用于 turbo stream。data: {turbo: false}

如何使 Devise Invitable 使用此 Devise 配置工作?

config.navigational_formats = ['*/*', :html, :turbo_stream]

或者我应该如何处理这种情况?

Ruby-on-Rails Ruby-On-Rails-7 设计

评论

0赞 LihnNguyen 3/30/2023
routes.rb 确保devise_for :users
0赞 don_Bigote 3/30/2023
我在路由中devise_for :users, controllers: { invitations: 'users/invitations' }。

答:

0赞 don_Bigote 4/1/2023 #1

rails 错误视图中的“应用程序错误”是这样的:

ActionView::MissingTemplate:缺少模板 users/invitations/new、devise/invitations/new、devise/new、application/new with {:locale=>[:en], :formats=>[:turbo_stream], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}

此错误表示“我找不到您的'新'模板”。

我能够使邀请函像这样工作:

在 app/views/devise/invitations/new.html.erb 中:

<%= render "form", resource: resource %>

在 app/views/devise/invitations/new.turbo_stream.erb 中:

<%= turbo_stream.replace dom_id(resource) do %>
  <%= render "form", resource: resource %>
<% end %>

在 app/views/devise/invitations/_form.html.erb 中,我像往常一样制作了form_for,但添加了一个等于 dom_id(resource) 的 id:

<%= form_for(resource, as: resource_name, url: user_invitation_path, html: { method: :post, id: dom_id(resource) }) do |f| %>

这将防止错误,因为 Rails 会找到文件并替换部分文件(如果表单提交有错误)。new.turbo_stream.erb

有关详细信息,请参阅: https://rubydoc.info/github/hotwired/turbo-rails/Turbo/StreamsHelper