Как назначить роль пользователю в Registration Controller и его представление с помощью Rolify и Devise

Я хочу, чтобы группа радиокнопок выбирала роль, на мой взгляд, но я не уверен, как с этим справиться. Я уже настроил преобразование и разработку драгоценных камней, но я не уверен, как назначить роли в представлении и контроллере. Я уже создал роли в консоли. Я хочу убедиться, что при выборе роли нет эксплойтов. Например, если человек попытается изменить имя роли в браузере и назначить его себе (например, администратору), это будет большой проблемой.

registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def create
    super
  end

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:firstname, :lastname, :email, :terms_of_service])
  end

user.rb

class User < ApplicationRecord
  rolify

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable, :timeoutable
  validates :terms_of_service, :allow_nil => false, :acceptance => true

end

часть представления для регистрации

<%= form_for(resource, as: resource_name, :role => "form", url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div class="form-group">
    <%= f.label t('label.user.form_content.firstname') %><br/>
    <%= f.text_field :firstname, autofocus: true, :class => "form-control text-center" %>
  </div>
  <div class="form-group">
    <%= f.label t('label.user.form_content.lastname') %><br/>
    <%= f.text_field :lastname, :class => "form-control text-center" %>
  </div>
  <div class="form-group">
    <%= f.label t('label.user.form_content.email') %><br/>
    <%= f.email_field :email, :class => "form-control text-center" %>
  </div>
  <div class="row">
    <div class="col-md-6">
      <div class="form-group">
        <%= f.label t('label.user.form_content.password') %>
        <% if @minimum_password_length %>
            <em>(<%= @minimum_password_length %> characters minimum)</em>
        <% end %><br/>
        <%= f.password_field :password, autocomplete: "off", :class => "form-control text-center" %>
      </div>
    </div>
    <div class="col-md-6">
      <div class="form-group">
        <%= f.label t('label.user.form_content.password_confirmation') %>
        <% if @minimum_password_length %>
            <em>(Must be same with password)</em><br/>
        <% end %><br/>
        <%= f.password_field :password_confirmation, autocomplete: "off", :class => "form-control text-center" %>
      </div>
    </div>
  </div>
<% end %>

person Nerzid    schedule 25.02.2017    source источник


Ответы (1)


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

Rolify: проверка ролей со сложной функциональностью внутри пользователя модель

Кроме того, я добавляю роли после регистрации пользователя внутри Registrations_controller, я оставлю еще одну ссылку, показывающую, как это сделать:

Добавление роли динамически через форму с использованием Rolify вдоль с Devise и Cancan

Надеюсь это поможет!

person Alejandro Aristizábal    schedule 24.03.2017