【问题标题】:How to assign roles to a user with devise, cancan and rolify?如何使用 devise、cancan 和 rolify 为用户分配角色?
【发布时间】:2014-09-30 09:21:23
【问题描述】:

我是 Ruby on Rails 的新手,我遇到了这个错误:

in `const_get': uninitialized constant Devise::Models::RoleId (NameError)

当我从我的模型/user.rb 中删除这个“,:role_ids”时,应用程序可以工作,但我无法将角色分配给我的用户..

我的模型/role.rb

class Role < ActiveRecord::Base
    has_and_belongs_to_many :users, :join_table => :users_roles
    belongs_to :resource, :polymorphic => true

    scopify
end

我的路线:

Rails.application.routes.draw do
    resources :users
    root :to => 'home#index'

    devise_for :users, :skip => [:registrations, :sessions]

    as :user do
        get "/login" => "devise/sessions#new", :as => :new_user_session
        post "/login" => "devise/sessions#create", :as => :user_session
        delete "/logout" => "devise/sessions#destroy", :as => :destroy_user_session
    end
end

还有我的模型/user.rb

class User < ActiveRecord::Base
    rolify
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :role_ids
    validates :email, :uniqueness => true
end

和我的用户控制器:

class UsersController < ApplicationController
    load_and_authorize_resource
    def index
        @users = User.all
    end

    def show
        @user = User.find(params[:id])
    end

    def new
        @user = User.new
    end

    def edit
        @user = User.find(params[:id])
    end

    def create
        @user = User.new(user_params)

        if @user.save
            redirect_to @user, :flash => { :success => 'User was successfully created.' }
        else
            render :action => 'new'
        end
    end

    def update
        @user = User.find(params[:id])

        if params[:user][:password].blank?
            params[:user].delete(:password)
            params[:user].delete(:password_confirmation)
        end

        params[:user][:role_ids] ||= []

        if @user.update_attributes(user_params)
            sign_in(@user, :bypass => true) if @user == current_user
            redirect_to @user, :flash => { :success => 'User was successfully updated.' }
        else
            render :action => 'edit'
        end
    end


    def destroy
        @user = User.find(params[:id])
        @user.destroy
        redirect_to users_path, :flash => { :success => 'User was successfully deleted.' }
    end

    private
    def user_params
        params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
        if can? :manage, User
            params.require(:user).permit(:username, :email, :role_ids, :salt, :encrypted_password)
        else
            params[:user].delete(:role_ids)
            params[:user].delete(:email)
        end
    end
end

我遵循了这两个教程: http://danielboggs.com/articles/rails-authentication-and-user-management-via-crud/http://danielboggs.com/articles/rails-authentication-and-user-management-continued/

【问题讨论】:

  • 你试过 has_many :roles in user model 吗?
  • @knotito 是的,我收到此错误:SQLite3::SQLException: no such column: roles.user_id: SELECT COUNT(*) FROM "roles" WHERE "roles"."user_id" = ? AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))

标签: ruby-on-rails ruby devise cancan rolify


【解决方案1】:

我发现了问题。

解决办法是:

params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password, role_ids: [])

而不是:

params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password, role_ids)

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2012-06-08
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多