1
votes

I have been trying to get rolify gem to work FOREVER. I have cancancan and devise as well, i basically have a signup page with email, password, password_confirmation, and a dropdown box selecting role. and when i click sign up it gives me an error to the segment of code creating the DDbox. Can anyone help me get this working ? my ability.rb is this

`class Ability include CanCan::Ability

def initialize(user) user ||=User.new if user.has_role? :admin can :manage, :all elsif user.has_role? :regularUser can :read, Menu elsif user.has_role? :institution can :read, Menu elsif user.has_role? :franchiseOwner can :read, Menu
end

# Define abilities for the passed in user here. For example:
#
#   user ||= User.new # guest user (not logged in)
#   if user.admin?
#     can :manage, :all
#   else
#     can :read, :all
#   end
#
# The first argument to `can` is the action you are giving the user
# permission to do.
# If you pass :manage it will apply to every action. Other common actions
# here are :read, :create, :update and :destroy.
#
# The second argument is the resource the user can perform the action on.
# If you pass :all it will apply to every resource. Otherwise pass a Ruby
# class of the resource.
#
# The third argument is an optional hash of conditions to further filter the
# objects.
# For example, here the user can only update published articles.
#
#   can :update, Article, :published => true
#
# See the wiki for details:
# https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
end
 end `

and this the the dropdown box code snippet from my view/devise/registation/new.html.erb..
<%= user_form.select :role, options_from_collection_for_select(Role.all,"Institution","Regular User", "Franchise Owner")%>

this is my User.rb model

`class User < ActiveRecord::Base
 rolify :before_add => :before_add_method

 # Include default devise modules. Others available are:
 # :confirmable, :lockable, :timeoutable and :omniauthable
 devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

 def before_add_method(role)

 end
 end`

and my users_controller

`class UserController < ApplicationController
 def index
  @users = User.all
 end

 def new
   @user = User.new
 end


 # POST /userss
 # POST /users.json
 def create
 @user = User.new(user_params)
 @user.add_role params[:user][:role]
 end

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

1 Answers

0
votes

User.new does not save a record and as such will not have an id.

Try saving the user either with user.save or by using User.create instead so it has an id before adding the role. Otherwise the role wont have a user_id to use for it's association.

user = User.create(:email => '[email protected]', :password => 'somestring', :password_confirmation => 'somestring')

user.add_role :rolename