zzx
zzx

Reputation: 171

How to create an admin user with Ruby on Rails

I'm new to ruby on rails, and so far, I have created the user login, signup, signout, but I wanna create an admin user, and I have no idea how to do this.

route.rb is:

Rails.application.routes.draw do

  get 'courses/index'

  get 'courses/new'

  get 'courses/edit'

  get 'courses/show'

  get 'course/index'

  get 'course/new'

  get 'course/edit'

  get 'course/show'

  get 'sessions/signin'

  get 'sessions/main'

  get 'sessions/profile'

  get 'sessions/setting'

  get 'users/new'

  get 'home/index'

  resources :users, path_names: {new: "signup"} do
    collection do
      get "main", action: :new
    end
  end

  resources :sessions, path_names: {new: "signin", destroy: "signout"} do
    collection do
      get :signin
      get :main
      get :profile
      get :setting
    end
  end

  resources :home, only: [], path: "" do
    get :about
  end

  root 'home#index' 

  resources :courses, only: [:index, :new, :edit, :show]
  #resources :course, only: [:index, :new, :edit, :show]

     resources :courses

     resources :course_groups
     patch 'course_groups/:id/add_course', to: 'course_groups#add_course', as: 'course_group_add_course'
     delete 'course_groups/:id/delete_course', to: 'course_groups#destory_course', as: 'course_group_destory_course'


     resources :rules 
     patch 'rules/:id/add_group', to: 'rules#add_group', as: 'rule_add_course_group'
     delete 'rules/:id/delete_group', to: 'rules#destroy_group', as: 'rule_destroy_course_group'

     resources :requirements
     patch 'requirements/:id/add_rule', to: 'requirements#add_rule', as: 'requirement_add_rules'
     delete 'requirements/:id/delete_rule', to: 'requirements#destroy_rule', as: 'requirement_destroy_rules'


     #resources :plans     
     resources :users do
        resources :plans 
     end
     patch 'users/:user_id/plans/:id/add_course', to: 'plans#add_course', as: 'plan_add_course'
     delete 'users/:user_id/plans/:id/delete_course', to: 'plans#destory_course', as: 'plan_destory_course'


  match '/about', to: 'home#about', via: 'get'
  match '/signup', to: 'users#new', via: 'get'
  match ':controller(/:action(/:id))(.:format)', via: 'get'
  match '/signin', to: 'sessions#new', via: 'get'
  match '/signout', to: 'sessions#destroy', via: 'delete'
  match '/main', to: 'users#new', via: 'get'
  #match '/profile', to: 'sessions#profile', via: 'get'
  match '/setting', to: 'sessions#setting', via: 'get'


  match '/editname', to: 'users#edit', via: 'get'  

  match '/show', to: 'users#show', via: 'get'
  match '/profile', to: 'users#profile', via: 'get'
  #match '/info', to: 'users#info', via: 'get'
  #match '/changepass', to: 'users#edit', via: 'get'
end

and my users_controller.rb is:

class UsersController < ApplicationController

  before_filter :check_if_signned_in, only: [:show, :edit, :update, :delete] 

  before_filter :signed_in_user, only: [:edit, :update]

  before_filter :skip_password_attribute, only: :update

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user, notice: 'User was sucessfully created!'
    else
      render action: "new"
    end
  end


  #if current user exits, then it can get back to the main page of user
  def show
    if current_user.nil?
      @user = User.find(params[:id])
    else
      @user = User.find(current_user)  
    end

  end


def edit 
  #@user = User.find(params[:id])
  #@user = User.find(current_user)
  @user = current_user
  @user.save
  @title = "Edit profile"
end


def update
  @user = User.find(params[:id])
  #@user = User.find(current_user)
  #if @user.update_attributes(user_params)
  if @user.update_attributes(user_params)
    flash[:success] = "Profile updated."
    #sign_in @user_params
    redirect_to @user
  else
    @title = "Edit profile"
    render 'edit'
  end
end


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

    def signed_in_user
      redirect_to signin_path, notice: "Please sign in." unless signed_in?
    end

    def edit_user
      params.require(:user).permit(:name)
    end

    def skip_password_attribute
      if params[:password].blank? && params[:password_confirmation].blank?
        params.except!(:password, :password_confirmation)
      end
    end

end

the application_controller.rb is:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  #protect_from_forgery with: :exception
  protect_from_forgery

  #before_filter :session_expire
  #before_filter :update_active_time

  include SessionsHelper

  def check_if_signned_in
    deny_access unless signed_in?
  end


#def update_active_time
#   session[:expires_at] = default_expire
#end

def is_owner
  current_user.id == params[:id]
end

#private
#   def get_session_time_left
#       expire_time = session[:expires_at] #|| default_expire
#       a = expire_time
#       b = Time.now
#       @session_time_left = (a - b).do_i
        #@session_time_left = (expire_time - Time.now).do_i
#   end


end

Anyone can teach me how to create an admin user please? When the admin user logins, it will go to another different page. Thank you in advance!

Upvotes: 2

Views: 2894

Answers (1)

Richard Peck
Richard Peck

Reputation: 76774

Without being rude, your code really needs to be cleaned up.

Your routes alone are a mess - I think I remember giving you some code to help them the other day, and it appears you've used it! However, you've left the other routes in there still - which is likely going to cause big issues down the line


Routes

Firstly, you need to get your routes in order:

#config/routes.rb
resources :courses
resources :users, path_names: {new: "signup"} do
   collection do
      get "main", action: :new
   end
end

resources :sessions, path_names: {new: "signin", destroy: "signout", index: "main", edit: "profile", update: "setting"}

resources :home, only: [], path: "" do
   get :about
end

 root 'home#index' 

 resources :courses, only: [:index, :new, :edit, :show]
 resources :course_groups do
    patch :add_course
    delete :delete_course
 end


 resources :rules do
     patch :add_group
     delete :delete_group
 end 

 resources :requirements do
     patch :add_rule
     delete :delete_rule
 end

 resources :users do
    resources :plans do
       patch :add_course
       delete :delete_course
    end
 end


 match '/about', to: 'home#about', via: 'get'
 match '/signup', to: 'users#new', via: 'get'
 match ':controller(/:action(/:id))(.:format)', via: 'get'
 match '/signin', to: 'sessions#new', via: 'get'
 match '/signout', to: 'sessions#destroy', via: 'delete'
 match '/main', to: 'users#new', via: 'get'
 match '/setting', to: 'sessions#setting', via: 'get'
 match '/editname', to: 'users#edit', via: 'get'  

Simply, everything in Rails is resource / object - orientated. This includes the routes, and you should therefore make sure that every route you have is constructed around a resource (that's why you can define routes as resources etc)

--

Admin

To create an admin user, there are several options available to you:

  1. Have a separate admin model
  2. Create an admin attribute in your User model

I would strongly recommend including an admin attribute in your User model - make it a boolean column like this:

#new migration
add_column :users, :admin, :boolean

This will allow you to call the following

@user = User.find params[:id]
@user.admin? #-> true / false

This will allow you to use several conditional statements in both the controllers & views of your application, to determine if the user had admin privileges or not

Upvotes: 1

Related Questions