2016-06-22 6 views
0

In meiner Rails-Anwendung habe ich einfach zwei Rollen, Admin und User, die ich in meinem Schema und Benutzermodell definiert habe. Hier ist meine schema.rb mit Benutzer-Tabelle:Rails: Benutzer wird nicht mit der richtigen Standardrolle erstellt

create_table "users", force: :cascade do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.integer "role",     default: 2 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 

end 

Zum einen ist hier mein Benutzermodell:

class User < ActiveRecord::Base 
    #Defining different roles 
    enum role: [:Admin, :User] 
    #Users can only have one scholarship application 
    has_one :applications 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

Meine Fähigkeit Modell:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
     if user.role = 1 
      can :manage, :all 
     elsif user.role = 2 
      can :manage, Application 
      can :manage, User 
     else 
      can :read, Static_Page 
     end 
    end 
end 

Meine Benutzer-Controller:

class UsersController < ApplicationController 
    before_action :authenticate_user 
    #Users who are not signed in cannot view users list 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 
    load_and_authorize_resource 

    # GET /users 
    # GET /users.json 
    def index 
    @users = User.all 
    end 

    # GET /users/1 
    # GET /users/1.json 
    def show 
    end 

    # GET /users/new 
    def new 
    @user = User.new 
    end 

    # GET /users/1/edit 
    def edit 
    @user = current_user 
    end 

    # POST /users 
    # POST /users.json 
    def create 
    @user = User.new(user_params) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render :show, status: :created, location: @user } 
     else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /users/1 
    # PATCH/PUT /users/1.json 
    def update 
    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /users/1 
    # DELETE /users/1.json 
    def destroy 
    @user.destroy 
    respond_to do |format| 
     format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_user 
     @user = User.find(params[:id]) 
    end 

    #Never trust paramaters from the scary internet, man. 
    def user_params 
     params.require(:user).permit(:first_name, :last_name) 
    end 
end 

In meinen Ansichten fügte ich etwas co hinzu Bedingungen ausgebracht werden, basierend auf der Rolle des Benutzers gezeigt, wie folgt aus:

<% if user_signed_in? %> 
<h4 class="center"> Welcome <%= current_user.first_name %>!</h4> 
<% end %> 
<% if user_signed_in? && current_user.role = "Admin" %> 

<h4 class="center"> You are a <%= current_user.role %>, you can view all applications, edit them, delete users, and more!!</h4> 
<% elsif user_signed_in? && current_user.role = "User" %> 
<h4 class="center"> Thank you for your interest in our scholarship. As a <%= current_user.role %>, you may create, edit, or delete your scholarship application now that you are signed in.</h4> 

<% else %> 
<h4 class="center"> Welcome to the Philanthropist's Scholarship Application! Please create an account to apply for our scholarship!</h4> 

<% end %> 

folgte ich der obigen Logik für einen Admin CP (für Administratoren) und Account-Einstellungen (für Benutzer) Blick in meine Benutzer view-, so dass die Admin-CP würde alle Benutzer wie das Standard-Rails-Gerüst für Benutzer anzeigen, während die Kontoeinstellungen nur die Benutzerinformationen für den aktuellen Benutzer anzeigen würden.

Nur Problem ist, wenn ich einen neuen Benutzer erstellen, sagt es immer, dass der Benutzer ein Administrator ist, ich einen neuen Benutzer erstellen, und der Wert der Rolle scheint nicht gleich 2 (der "Benutzer") und sie sind nur ein Admin und können alles tun.

Irgendwelche Vorschläge?

Antwort

1

Sie müssen == not = aus Ihrer Sicht verwenden, um die richtige Funktionalität zu erhalten. Extra zu, dass Ihr Feld in der Tabelle Benutzer eine ganze Zahl ...

t.integer "role",     default: 2 

<% if user_signed_in? %> 
<h4 class="center"> Welcome <%= current_user.first_name %>!</h4> 
<% end %> 
<% if user_signed_in? && current_user.role == 1 %> 

<h4 class="center"> You are a <%= current_user.role %>, you can view all applications, edit them, delete users, and more!!</h4> 
<% elsif user_signed_in? && current_user.role == 2 %> 
<h4 class="center"> Thank you for your interest in our scholarship. As a <%= current_user.role %>, you may create, edit, or delete your scholarship application now that you are signed in.</h4> 

<% else %> 
<h4 class="center"> Welcome to the Philanthropist's Scholarship Application! Please create an account to apply for our scholarship!</h4> 

<% end %> 
+0

können Sie eine Hilfsmethode verwenden drucken Admin oder Benutzer anhand von, wenn die current_user.role == 1. Wird der Helfer für Sie zusammengestellt und bearbeiten Sie den Beitrag - Im Moment von dem, was ich sehen kann Sie sind ein <% = current_user.role%>, wird eine Zahl basierend auf ihrer Rolle Nummer – Dave

+0

Hallo Dave, ich danke Ihnen für die Antwort. Ich habe es gestern Abend herausgefunden - mir fehlte noch ein weiterer wichtiger Punkt, ich hatte eine Enum-Rolle: [: Admin,: User], aber dann hatte ich die Rolle im Schema auf 2 gesetzt, aber ich hatte nichts auf zwei gesetzt es wurde 0 indiziert, wie admin = 0 und user ist 1. Also, ich habe es geschafft: Gast,: User,: Admin und setze den Standardwert auf 1. Danke! –

+0

Gern geschehen! froh, dass du es sortiert hast, es ist immer ein böses Gefühl, wenn alles funktioniert! – Dave

Verwandte Themen