提问人:don_Bigote 提问时间:3/29/2023 更新时间:4/1/2023 访问量:272
如何在 Rails 7 和 Turbo Stream 中使用 Devise Invitable
How to use Devise Invitable with Rails 7 and Turbo Stream
问:
我有一个带有 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]
或者我应该如何处理这种情况?
答:
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
评论
devise_for :users