mirror of
				https://github.com/fspc/BikeShed-1.git
				synced 2025-10-31 00:45:35 -04:00 
			
		
		
		
	Added user roles and authentication, sign in/out
This commit is contained in:
		
							parent
							
								
									bb27c7a585
								
							
						
					
					
						commit
						db9982dcd2
					
				
							
								
								
									
										5
									
								
								app/assets/javascripts/custom_netzke_helpers.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/assets/javascripts/custom_netzke_helpers.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| //when signed out, or session expires forward to sign in page
 | ||||
| Ext.Ajax.on('requestexception', function(conn, response, options) { | ||||
|   if (response.status === 401) { window.location = '/users/sign_in'; } | ||||
| }, this); | ||||
| 
 | ||||
| @ -1,15 +1,46 @@ | ||||
| class AppTabPanel < Netzke::Basepack::TabPanel | ||||
|  component :bikes_border | ||||
|  component :brands_and_models_border | ||||
|  component :users_and_profiles_border | ||||
|  component :logs | ||||
|  component :bike_log_form | ||||
| 
 | ||||
|   action :sign_out do |c| | ||||
|     c.icon = :door_out | ||||
|     c.text = "Sign out #{controller.current_user.email}" if controller.current_user | ||||
|   end | ||||
| 
 | ||||
|   def configure(c) | ||||
|     c.active_tab = 3 | ||||
| 
 | ||||
|     #all users | ||||
|     @@app_tab_panel_items = [ :bikes_border, :brands_and_models_border] | ||||
| 
 | ||||
|     #for users | ||||
|     if controller.current_user.user? | ||||
|       @@app_tab_panel_items.concat [:user_profile_border] | ||||
|     end | ||||
|     #for admins | ||||
|     if controller.current_user.admin? | ||||
|       @@app_tab_panel_items.concat [:users_and_profiles_border, :logs] | ||||
|     end | ||||
| 
 | ||||
|     @@app_tab_panel_items.each do |item| | ||||
|       self.class.component item | ||||
|     end | ||||
| 
 | ||||
|     c.active_tab = 0 | ||||
|     c.prevent_header = true | ||||
|     c.items = [ :bikes_border, :brands_and_models_border, :users_and_profiles_border, :logs, :bike_log_form] | ||||
|     c.tbar = [:sign_out] | ||||
|     c.items = @@app_tab_panel_items | ||||
|     super | ||||
|   end | ||||
| 
 | ||||
|   js_configure do |c| | ||||
|     c.on_sign_out = <<-JS | ||||
|       //this will give a 401 error, but made 401 exceptions forward to 'users/sign_in' | ||||
|       function(){ | ||||
|         Ext.Ajax.request({ | ||||
|            url: '/users/sign_out', | ||||
|            method: 'DELETE' | ||||
|         });         | ||||
|       } | ||||
|     JS | ||||
|   end | ||||
| 
 | ||||
| end | ||||
| 
 | ||||
|  | ||||
| @ -2,25 +2,19 @@ class BikeBrands < Netzke::Basepack::Grid | ||||
|   def configure(c) | ||||
|     super | ||||
|     c.model = "BikeBrand" | ||||
|     c.title = "Brands" | ||||
| 
 | ||||
|      | ||||
| =begin | ||||
|     c.columns = [ | ||||
|       :done, | ||||
|       :name, | ||||
|       {name: :notes, flex: 1}, | ||||
|       :priority, | ||||
|       {name: :due, header: "Due on"} | ||||
|     ] | ||||
| =end | ||||
|     #c.enable_context_menu = false | ||||
|     #c.context_menu = false | ||||
|     #c.enable_edit_in_form = false | ||||
|     #c.scope = {done: [nil, false]} | ||||
|     if controller.current_user.user? | ||||
|       c.prohibit_update = true | ||||
|       c.prohibit_create = true | ||||
|       c.prohibit_delete = true | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   #override with nil to remove actions | ||||
|   def default_bbar | ||||
|     [ :apply, :add_in_form, :search ] | ||||
|     bbar = [ :search ] | ||||
|     bbar.concat [ :apply, :add_in_form ] if not controller.current_user.user? | ||||
|     bbar | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -23,6 +23,12 @@ class BikeLogs < Netzke::Basepack::Grid | ||||
|       { :name => :created_at, :read_only => true}, | ||||
|       { :name => :updated_at, :read_only => true} | ||||
|     ] | ||||
|      | ||||
|     if controller.current_user.user? | ||||
|       c.prohibit_update = true | ||||
|       c.prohibit_create = true | ||||
|       c.prohibit_delete = true | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| 
 | ||||
| @ -37,6 +43,8 @@ class BikeLogs < Netzke::Basepack::Grid | ||||
| 
 | ||||
|   #override with nil to remove actions | ||||
|   def default_bbar | ||||
|     [ :apply, :add_in_form, :search ] | ||||
|     bbar = [ :search ] | ||||
|     bbar.concat [ :apply, :add_in_form ] if not controller.current_user.user? | ||||
|     bbar | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -3,21 +3,28 @@ class BikeModels < Netzke::Basepack::Grid | ||||
|     super | ||||
| 
 | ||||
|     c.model = "BikeModel" | ||||
|     c.title = "Models" | ||||
|     c.data_store = {auto_load: false} | ||||
|     c.scope = lambda { |rel| puts session.inspect; rel.where(:bike_brand_id => session[:selected_bike_brand_id]);} | ||||
|     #c.strong_default_attrs = lambda { |rel| puts rel.inspect;} | ||||
|      | ||||
|     c.strong_default_attrs = { | ||||
|       :bike_brand_id => session[:selected_bike_brand_id] | ||||
|     } | ||||
| 
 | ||||
|     c.columns = [ | ||||
|       :model | ||||
|       { :name => :model } | ||||
|     ] | ||||
|     #c.enable_context_menu = false | ||||
|     #c.context_menu = false | ||||
|     #c.enable_edit_in_form = false | ||||
|     #c.scope = {done: [nil, false]} | ||||
| 
 | ||||
|     if controller.current_user.user? | ||||
|       c.prohibit_update = true | ||||
|       c.prohibit_create = true | ||||
|       c.prohibit_delete = true | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   #override with nil to remove actions | ||||
|   def default_bbar | ||||
|     [ :apply, :add_in_form, :search ] | ||||
|     bbar = [ :search ] | ||||
|     bbar.concat [ :apply, :add_in_form ] if not controller.current_user.user? | ||||
|     bbar | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -40,10 +40,11 @@ class Bikes < Netzke::Basepack::Grid | ||||
|             // setting the 'rowclick' event | ||||
|             var view = this.getView(); | ||||
|             view.on('itemclick', function(view, record){ | ||||
|             console.log(view); | ||||
|             console.log(record); | ||||
|               console.log(view); | ||||
|               console.log(record); | ||||
|               // The beauty of using Ext.Direct: calling 3 endpoints in a row, which results in a single call to the server! | ||||
|               this.selectBikeBrand({bike_brand_id: record.get('bike_brand__brand')}); | ||||
|               console.log(record.get('bike_brand__brand')); | ||||
|             }, this); | ||||
|           } | ||||
|         JS | ||||
| @ -53,7 +54,7 @@ class Bikes < Netzke::Basepack::Grid | ||||
|     # store selected boss id in the session for this component's instance | ||||
|     session[:selected_bike_brand_id] = params[:bike_brand_id] | ||||
|     puts "BikeID-----------------------------" | ||||
|     #puts params[:bike_brand_id] | ||||
|     puts params[:bike_brand_id] | ||||
|     puts session.inspect | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -7,7 +7,6 @@ class BrandsAndModelsBorder < Netzke::Base | ||||
|     super | ||||
|     c.title = "Brands/Models" | ||||
|     c.items = [ | ||||
| #      { netzke_component: :bike_brands, region: :center, split: true } | ||||
|      { netzke_component: :bike_brands, region: :center, split: true }, | ||||
|      { netzke_component: :bike_models, region: :east, width: 500, split: true} | ||||
|     ] | ||||
| @ -17,7 +16,7 @@ class BrandsAndModelsBorder < Netzke::Base | ||||
|     c.layout = :border | ||||
|     c.border = false | ||||
| 
 | ||||
| # Overriding initComponent | ||||
|     # Overriding initComponent | ||||
|     c.init_component = <<-JS | ||||
|       function(){ | ||||
|         // calling superclass's initComponent | ||||
| @ -40,18 +39,6 @@ class BrandsAndModelsBorder < Netzke::Base | ||||
|     puts "BikeBrandID-----------------------------" | ||||
|     #puts params[:bike_brand_id] | ||||
|     puts session.inspect | ||||
| 
 | ||||
| =begin | ||||
|     brand = BikeBrand.find_by_id(params[:bike_brand_id]) | ||||
|     bike_models_grid = component_instance(:bike_models) | ||||
|     bike_models_data = bike_models_grid.get_data | ||||
| 
 | ||||
|     { | ||||
|       :bike_models=> {:load_store_data => bike_models_data, :set_title => "Models for #{brand.brand}"}, | ||||
|     } | ||||
| =end  | ||||
|   end | ||||
| 
 | ||||
| 
 | ||||
|    | ||||
| end | ||||
|  | ||||
| @ -3,15 +3,31 @@ class UserLogs < Netzke::Basepack::Grid | ||||
|   def configure(c) | ||||
|     super | ||||
| 
 | ||||
|     c.model = "ActsAsLoggable::Log" | ||||
|     c.title = "User History" | ||||
|     c.data_store = {auto_load: false} | ||||
|     c.scope = lambda { |rel| puts session.inspect; rel.where(:loggable_type => 'User',:loggable_id => session[:selected_user_id]);} | ||||
|     c.strong_default_attrs = { | ||||
|     #all users | ||||
|     user_log_strong_default_attrs = { | ||||
|       :loggable_type => 'User', | ||||
|       :loggable_id => session[:selected_user_id], | ||||
|       :log_action_type => 'ActsAsLoggable::UserAction' | ||||
|     } | ||||
| 
 | ||||
|     #just users | ||||
|     if controller.current_user.user? | ||||
|       user_log_scope = lambda { |rel| rel.where(:loggable_type => 'User',:loggable_id => controller.current_user.id)} | ||||
|       user_log_strong_default_attrs.merge!( { :loggable_id => controller.current_user.id } ) | ||||
|       user_log_data_store = {auto_load: true } | ||||
|     #admins and staff | ||||
|     else | ||||
|       user_log_scope = lambda { |rel| puts session.inspect; rel.where(:loggable_type => 'User',:loggable_id => session[:selected_user_id]);} | ||||
|       user_log_strong_default_attrs.merge!( { :loggable_id => session[:selected_user_id] } ) | ||||
|       user_log_data_store = {auto_load: true } | ||||
|     end | ||||
| 
 | ||||
|     c.model = "ActsAsLoggable::Log" | ||||
|     c.title = "User History" | ||||
|     c.data_store = user_log_data_store | ||||
|     c.scope = user_log_scope | ||||
|     puts "user_log_strong_default_attrs" | ||||
|     puts user_log_strong_default_attrs.inspect | ||||
|     c.strong_default_attrs = user_log_strong_default_attrs | ||||
|     c.columns = [ | ||||
|       { :name => :start_date, :format => "g:ia - D, M j - Y", :width => 165, :default_value => Time.now.to_formatted_s(:db) }, | ||||
|       { :name => :end_date, :hidden => true, :default_value => Time.now.to_formatted_s(:db) }, | ||||
|  | ||||
							
								
								
									
										21
									
								
								app/components/user_profile_border.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/components/user_profile_border.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| class UserProfileBorder < Netzke::Base | ||||
|   # Remember regions collapse state and size | ||||
|   include Netzke::Basepack::ItemPersistence | ||||
|   component :user_logs | ||||
|   component :user_profiles | ||||
| 
 | ||||
|   def configure(c) | ||||
|     super | ||||
|     c.title = "Profile" | ||||
|     c.items = [ | ||||
|      { netzke_component: :user_logs, region: :center, split: true}, | ||||
|      { netzke_component: :user_profiles, region: :south, height: 150, split: true } | ||||
|     ] | ||||
|   end | ||||
| 
 | ||||
|   js_configure do |c| | ||||
|     c.layout = :border | ||||
|     c.border = false | ||||
|   end | ||||
| 
 | ||||
| end | ||||
| @ -1,10 +1,19 @@ | ||||
| class UserProfiles < Netzke::Basepack::Grid | ||||
|   def configure(c) | ||||
|     super | ||||
| 
 | ||||
|     if controller.current_user.user? | ||||
|       user_profiles_scope = lambda { |rel| rel.where(:user_id => controller.current_user.id);} | ||||
|       user_profiles_data_store = { auto_load: true } | ||||
|     else | ||||
|       user_profiles_scope = lambda { |rel| puts session.inspect; rel.where(:user_id => session[:selected_user_id]);} | ||||
|       user_profiles_data_store = { auto_load: false} | ||||
|     end | ||||
| 
 | ||||
|     c.model = "UserProfile" | ||||
|     c.title = "User Profiles" | ||||
|     c.data_store = {auto_load: false} | ||||
|     c.scope = lambda { |rel| puts session.inspect; rel.where(:user_id => session[:selected_user_id]);} | ||||
|     c.title = "Profile" | ||||
|     c.data_store = user_profiles_data_store | ||||
|     c.scope = user_profiles_scope | ||||
|     c.columns = [ | ||||
|       { :name => :bike__serial_number}, | ||||
|       :addrStreet1, | ||||
|  | ||||
| @ -7,7 +7,8 @@ class Users < Netzke::Basepack::Grid | ||||
|       :first_name, | ||||
|       :last_name, | ||||
|       :nickname, | ||||
|       :email | ||||
|       :email, | ||||
|       :user_role__role | ||||
|     ] | ||||
|   end | ||||
| 
 | ||||
|  | ||||
| @ -10,7 +10,7 @@ class UsersAndProfilesBorder < Netzke::Base | ||||
|     c.title = "Users/Profiles" | ||||
|     c.items = [ | ||||
|      { netzke_component: :users, region: :center, width: 300, split: true }, | ||||
|     { netzke_component: :user_profiles, region: :south, height: 150, split: true}, | ||||
|      { netzke_component: :user_profiles, region: :south, height: 150, split: true}, | ||||
|      { netzke_component: :user_logs, region: :east, split: true} | ||||
|     ] | ||||
|   end | ||||
| @ -19,7 +19,7 @@ class UsersAndProfilesBorder < Netzke::Base | ||||
|     c.layout = :border | ||||
|     c.border = false | ||||
| 
 | ||||
| # Overriding initComponent | ||||
|     # Overriding initComponent | ||||
|     c.init_component = <<-JS | ||||
|       function(){ | ||||
|         // calling superclass's initComponent | ||||
| @ -41,7 +41,7 @@ class UsersAndProfilesBorder < Netzke::Base | ||||
|     # store selected boss id in the session for this component's instance | ||||
|     session[:selected_user_id] = params[:user_id] | ||||
|     puts "UserID-----------------------------" | ||||
|     #puts params[:bike_brand_id] | ||||
|     puts params[:user_id] | ||||
|     puts session.inspect | ||||
|   end | ||||
|    | ||||
|  | ||||
| @ -1,3 +1,5 @@ | ||||
| class ApplicationController < ActionController::Base | ||||
|   before_filter :authenticate_user! | ||||
|   protect_from_forgery | ||||
|    | ||||
| end | ||||
|  | ||||
| @ -7,9 +7,10 @@ class User < ActiveRecord::Base | ||||
| 
 | ||||
|   # Setup accessible (or protected) attributes for your model | ||||
|   attr_accessible :email, :password, :password_confirmation, :remember_me, | ||||
|     :first_name, :last_name, :nickname | ||||
|     :first_name, :last_name, :nickname, :role_id | ||||
| 
 | ||||
|   has_many :user_profiles | ||||
|   belongs_to :user_role | ||||
| 
 | ||||
|   validates :first_name, :presence => true | ||||
|   validates :last_name, :presence => true | ||||
| @ -19,4 +20,16 @@ class User < ActiveRecord::Base | ||||
|   def to_s | ||||
|     "#{first_name} #{last_name}" | ||||
|   end | ||||
| 
 | ||||
|   def user? | ||||
|     user_role.to_s == "user" | ||||
|   end | ||||
| 
 | ||||
|   def staff? | ||||
|     user_role.to_s == "staff" | ||||
|   end | ||||
| 
 | ||||
|   def admin? | ||||
|     user_role.to_s == "admin" | ||||
|   end | ||||
| end | ||||
|  | ||||
							
								
								
									
										11
									
								
								app/models/user_role.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/models/user_role.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| class UserRole < ActiveRecord::Base | ||||
|   attr_accessible :role | ||||
| 
 | ||||
|   has_many :users | ||||
| 
 | ||||
|   self.per_page = 15 | ||||
| 
 | ||||
|   def to_s | ||||
|     self.role | ||||
|   end | ||||
| end | ||||
| @ -8,7 +8,7 @@ Velocipede::Application.routes.draw do | ||||
|   # first created -> highest priority. | ||||
| 
 | ||||
|   match 'site/index' => 'site#index' | ||||
| 
 | ||||
| =end | ||||
|   resources :bike_brands, :except => [:edit, :delete] | ||||
|   resources :bike_models, :except => [:edit, :delete] | ||||
|   resources :bike_statuses | ||||
| @ -38,6 +38,5 @@ Velocipede::Application.routes.draw do | ||||
| 
 | ||||
|   #match ':loggable_type/:loggable_id/logs' => 'acts_as_loggable/logs#index', :as => 'loggable_logs' | ||||
| 
 | ||||
| =end | ||||
|   root :to => 'site#index' | ||||
| end | ||||
|  | ||||
| @ -19,6 +19,8 @@ class DeviseCreateUsers < ActiveRecord::Migration | ||||
|       t.string   :current_sign_in_ip | ||||
|       t.string   :last_sign_in_ip | ||||
| 
 | ||||
|       t.integer  :user_role_id | ||||
| 
 | ||||
|       ## Encryptable | ||||
|       # t.string :password_salt | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										8
									
								
								db/migrate/20121229160809_create_user_roles.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								db/migrate/20121229160809_create_user_roles.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| class CreateUserRoles < ActiveRecord::Migration | ||||
|   def change | ||||
|     create_table(:user_roles) do |t| | ||||
|       t.string :role | ||||
|       t.timestamps | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										24
									
								
								db/schema.rb
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								db/schema.rb
									
									
									
									
									
								
							| @ -11,7 +11,7 @@ | ||||
| # | ||||
| # It's strongly recommended to check this file into your version control system. | ||||
| 
 | ||||
| ActiveRecord::Schema.define(:version => 20121205043759) do | ||||
| ActiveRecord::Schema.define(:version => 20121229160809) do | ||||
| 
 | ||||
|   create_table "bike_actions", :force => true do |t| | ||||
|     t.string   "action",     :limit => 128, :null => false | ||||
| @ -67,13 +67,14 @@ ActiveRecord::Schema.define(:version => 20121205043759) do | ||||
|     t.string   "loggable_type" | ||||
|     t.integer  "logger_id" | ||||
|     t.string   "logger_type" | ||||
|     t.string   "context",       :limit => 128 | ||||
|     t.datetime "start_date",                                   :null => false | ||||
|     t.datetime "end_date",                                     :null => false | ||||
|     t.text     "description",                  :default => "" | ||||
|     t.integer  "action_id",                    :default => 0 | ||||
|     t.datetime "created_at",                                   :null => false | ||||
|     t.datetime "updated_at",                                   :null => false | ||||
|     t.string   "context",         :limit => 128 | ||||
|     t.datetime "start_date",                                     :null => false | ||||
|     t.datetime "end_date",                                       :null => false | ||||
|     t.text     "description",                    :default => "" | ||||
|     t.integer  "log_action_id" | ||||
|     t.string   "log_action_type" | ||||
|     t.datetime "created_at",                                     :null => false | ||||
|     t.datetime "updated_at",                                     :null => false | ||||
|   end | ||||
| 
 | ||||
|   add_index "logs", ["loggable_id", "loggable_type", "context"], :name => "index_logs_on_loggable_id_and_loggable_type_and_context" | ||||
| @ -112,6 +113,12 @@ ActiveRecord::Schema.define(:version => 20121205043759) do | ||||
|     t.datetime "updated_at",  :null => false | ||||
|   end | ||||
| 
 | ||||
|   create_table "user_roles", :force => true do |t| | ||||
|     t.string   "role" | ||||
|     t.datetime "created_at", :null => false | ||||
|     t.datetime "updated_at", :null => false | ||||
|   end | ||||
| 
 | ||||
|   create_table "users", :force => true do |t| | ||||
|     t.string   "email",                  :default => "", :null => false | ||||
|     t.string   "encrypted_password",     :default => "", :null => false | ||||
| @ -123,6 +130,7 @@ ActiveRecord::Schema.define(:version => 20121205043759) do | ||||
|     t.datetime "last_sign_in_at" | ||||
|     t.string   "current_sign_in_ip" | ||||
|     t.string   "last_sign_in_ip" | ||||
|     t.integer  "user_role_id" | ||||
|     t.datetime "created_at",                             :null => false | ||||
|     t.datetime "updated_at",                             :null => false | ||||
|     t.integer  "failed_attempts",        :default => 0 | ||||
|  | ||||
							
								
								
									
										9
									
								
								db/seed/fixtures/user_roles.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								db/seed/fixtures/user_roles.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| user: | ||||
|   id: 1 | ||||
|   role: user | ||||
| staff: | ||||
|   id: 2 | ||||
|   role: staff | ||||
| admin: | ||||
|   id: 3 | ||||
|   role: admin | ||||
							
								
								
									
										10
									
								
								db/seeds.rb
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								db/seeds.rb
									
									
									
									
									
								
							| @ -20,9 +20,13 @@ end | ||||
| 
 | ||||
| if Rails.env.development? | ||||
| 
 | ||||
|   #create default dev user | ||||
|   FactoryGirl.create(:user) if User.all.empty? | ||||
|   FactoryGirl.create(:user_profile) if UserProfile.all.empty? | ||||
|   #create default admin user | ||||
|   if User.all.empty? | ||||
|     FactoryGirl.create(:user) | ||||
|     FactoryGirl.create(:staff) | ||||
|     FactoryGirl.create(:admin) | ||||
|     FactoryGirl.create(:user_profile) | ||||
|   end | ||||
| 
 | ||||
|   #create fake bikes | ||||
|   if Bike.all.empty? | ||||
|  | ||||
| @ -1,14 +0,0 @@ | ||||
| FactoryGirl.define do | ||||
|   factory :user do | ||||
|     sequence(:email) { |n| "user_#{n}@example.com" } | ||||
|     password 'password' | ||||
|     password_confirmation { password } | ||||
|     first_name 'Michael' | ||||
|     last_name 'Scott' | ||||
|   end | ||||
| 
 | ||||
| # factory :team do | ||||
| #   sequence(:name) { |n| "mash it #{n} times" } | ||||
| #   association :captain, :factory => :user | ||||
| # end | ||||
| end | ||||
							
								
								
									
										21
									
								
								spec/factories/users.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								spec/factories/users.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| FactoryGirl.define do | ||||
|   factory :user do | ||||
|     sequence(:email) { |n| "user_#{n}@example.com" } | ||||
|     password 'password' | ||||
|     password_confirmation { password } | ||||
|     first_name 'Michael' | ||||
|     last_name 'Scott' | ||||
|     user_role_id 1 | ||||
| 
 | ||||
|     factory :staff do | ||||
|       first_name 'Staff' | ||||
|       user_role_id 2 | ||||
|     end | ||||
| 
 | ||||
|     factory :admin do | ||||
|       first_name 'Admin' | ||||
|       user_role_id 3 | ||||
|     end | ||||
| 
 | ||||
|   end | ||||
| end | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user