当角色名称需要与role_id匹配时(使用devise)添加要选择的角色来设计注册表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当角色名称需要与role_id匹配时(使用devise)添加要选择的角色来设计注册表单相关的知识,希望对你有一定的参考价值。

我是Rails的新手(使用rails 6),我有一个问题,我的特定用例在现场没有得到回答。

[基本标准与许多问题相同-使用devise时向Rails应用程序添加基于角色的身份验证。

我实现此目的的方法是创建一个角色表,并使它与用户表之间具有一对多的关系。

我只需要两个用户:guest和admin,它们分别具有1、2个ID。我使用Rails控制台将值手动插入到角色表中。

现在,我在注册表单时遇到麻烦,这是默认创建的一个devise gem:

<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

我要添加的选择字段将显示“ admin”和“ guest”,并且当用户提交表单时,正确的role_id将被添加到用户表中的用户记录中,但是我没有获取如何告知devise视图有关角色表的存在以及如何将角色的字符串值与我希望用户准确拥有的角色id匹配。

所以我的问题是:

  1. 如何在设计注册表单中将角色添加到选择字段?

  2. 用户选择角色字符串名称之一,并将其​​与将在处理表单时添加到用户的角色ID匹配后如何处理?

我看到了以下问题,很多人都喜欢,但是在提交表单之前,我没有看到他们中的任何一个处理带有ID的匹配字符串:

Devise Add Admin Role

how to automatically add a role to a user when signing up using devise

Adding Fields To Devise Sign Up Using Rails 4

Multiple models associated with devise user - fill in one model based on selection of role

如果有一个问题可以回答我的问题,对不起,很高兴获得该链接并关闭此问题。

如果您需要更多信息,请告诉我。

谢谢!

答案

使用枚举来区分管理员和来宾似乎是最好的选择,它将避免您使模型/表单复杂化,例如嵌套属性。

这是一个例子...

在用户表上创建role列。

$ rails g migration add_role_to_users role:integer

在您的迁移文件中,确保将默认值设置为0。

add_column :users, :role, :integer, default: 0

然后,在迁移数据库之后,在您的User模型中添加枚举...

class User < ApplicationRecord
  enum role:  guest: 0, admin: 1  
  ...
end

添加另一个角色就像向角色枚举添加键/值一样简单。

然后,以您的设计形式,可以添加类似...的内容>

<%= f.label :role %>
<%= f.select :role, User.roles.keys %>

[您还需要确保将role添加为允许的参数...您似乎在注册时将其添加为字段,因此在ApplicationController ...

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:role])
  end
end

如果要执行此操作,还必须删除角色表和关联。

以上是关于当角色名称需要与role_id匹配时(使用devise)添加要选择的角色来设计注册表单的主要内容,如果未能解决你的问题,请参考以下文章

MySQL根据条件多次加入

当这些列的名称与列表中的名称匹配时,如何跨熊猫列添加所有值?

Flask与MySQL的配置操作

当id与输入框名称扩展名id匹配时,如何在单列中将动态输入框值插入表中

选择器“new-selector”与任何元素都不匹配

仅当 UID 与 Firebase Firestore 中的集合名称匹配时,如何读取集合?