Добавление выбора роли для разработки формы регистрации, когда имя роли должно соответствовать role_id (с использованием devise) - PullRequest
0 голосов
/ 23 октября 2019

Я новичок в рельсах (использую рельсы 6), и у меня есть вопрос, на который я не ответил на сайте для моего конкретного случая использования.

Основной сценарий такой же, как вмногие вопросы - добавление аутентификации на основе ролей в приложение rails при использовании devise.

Я реализовал это, создав таблицу ролей и установив отношения между ними и таблицей пользователей.

Мне нужно только два пользователя: гость и администратор, и у них есть 1, 2 идентификатора, соответственно. Я вставил значения в таблицу ролей вручную, используя консоль rails.

Теперь у меня проблемы с формой регистрации, которая является одним из созданных по умолчанию драгоценных камней:

<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 о существовании таблицы ролей и как сопоставить строковое значение роли с идентификатором роли, который должен иметь пользователь.

Итак, мои вопросы:

  1. Как добавить роли в поле выбора в форме регистрации устройства?

  2. Как обработать после того, как пользователь выберет одну из имен ролей,и сопоставить его с идентификатором роли, который будет добавлен пользователю при обработке формы?

Я видел следующие вопросы и многим они нравятся, но я не видел ни одного из нихработа с соответствующей строкой с идентификатором befoФорма отправлена:

Devise Add Admin Role

как автоматически добавить роль пользователю при регистрации с помощью devise

Добавление полей для разработки Регистрация с использованием Rails 4

Несколько моделей, связанных с разработчиком пользователя - заполните одну модель на основе выбора роли

Если на мой вопрос возник вопрос, извините, и я был бы рад получить ссылку и закрыть этот вопрос.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

0 голосов
/ 23 октября 2019

Использование enum для разграничения администраторов и гостей кажется лучшим вариантом и избавит вас от необходимости усложнять вашу модель / форму ненужными вещами, такими как вложенные атрибуты.

Вот пример ...

Создайте столбец 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

Если вы согласитесь с этим, вам также придется удалить таблицу ролей и ассоциации.

...