Как разрешить новый параметр в rails (devise) при реализации авторизации на основе ролей

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

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up)  { |u| u.permit(  :email, :password, :password_confirmation, roles: [] ) }
end

end

Это то, что у меня есть в моей пользовательской модели

class User < ApplicationRecord
  belongs_to :role
  # has_many :Product
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

         ROLES = %i[admin manager customer]

def user_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation, :role)
end


end

миграция выглядит следующим образом

class AddRoleToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :role, :string
  end
end

Пожалуйста, помогите мне решить эту проблему. Спасибо.


person Tharindu Thathsarana    schedule 01.08.2017    source источник
comment
Возможный дубликат добавление нового поля вызывает ошибку   -  person Mayur Shah    schedule 01.08.2017


Ответы (1)


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

devise_parameter_sanitizer.permit(:sign_up)  { |u| u.permit(  :email, :password, :password_confirmation, roles: [] ) }

to

devise_parameter_sanitizer.permit(:sign_up)  { |u| u.permit(  :email, :password, :password_confirmation, :role ) }
#

И тебе должно быть хорошо идти.

person Mark    schedule 01.08.2017
comment
Все еще получаю тот же результат - person Tharindu Thathsarana; 01.08.2017
comment
Started POST /users for 127.0.0.1 at 2017-08-01 19:29:24 +0530 Processing by Devise::RegistrationsController#create as HTML Parameters: {utf8=›✓, authenticity_token=›OH3R7o1M+0BkzD2iVG/yHiovWZ1oj0wBafxgU5C2kBu1q3LD5dNWcVpDQ/c6QwfpZ2UTINpghRYYxmodUxBT+ Q==, user=›{email=›[email protected], password=›[FILTERED], password_confirmation=›[FILTERED], role=›admin}, commit=›Sign up} Недопустимый параметр: role - person Tharindu Thathsarana; 01.08.2017
comment
(0,1 мс) начать транзакцию Пользователь существует (11,1 мс) ВЫБРАТЬ 1 КАК один ОТ пользователей ГДЕ users.email = ? ПРЕДЕЛ ? [[email, [email protected]], [LIMIT, 1]] (0,1 мс) транзакция отката - person Tharindu Thathsarana; 01.08.2017
comment
Мой плохой - я думаю, что это должна быть "роль", а не "роли" - person Mark; 01.08.2017