2017-08-06 52 views
0

出於某種原因,我以管理員身份登錄後,我被重定向到用戶註冊頁面。如果我以普通用戶身份登錄,則可以獲得管理員擁有的權限,例如創建和刪除帖子的權限。爲什麼我的應用程序要求我在以管理員身份登錄後以用戶身份登錄?

route.rb

Rails.application.routes.draw do 
    devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } 
    devise_for :admins, path: 'admins' 
    root 'home#index' 
    get '/' => "courses#index", as: :user_root 
    resources :courses, :lessons 
end 

application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_user! 

    private 
    def after_sign_in_path_for(resource) 
    courses_path 
    end 

    def after_sign_out_path_for(resource) 
    root_path 
    end 
end 

show.html.erb

<div class="panel panel-default"> 
    <div class="panel-heading"><h2><%= @lesson.title %></h2></div> 
    <div class="panel-body"><%= @lesson.content %></div> 
</div> 

</p> 

<% if admin_signed_in? %> 
<%= link_to "delete lesson", lesson_path(@lesson), method: :delete, data: { confirm: 'Are you sure?' } %> 
<%= link_to "edit lesson", edit_lesson_path %> 
<% end %> 
<br> 
<br> 
<%= link_to "<<back to lesson", course_path(@lesson.course_id)%> 

這可能會造成這個問題的任何其他文件?

+0

似乎是一個'Admin'和'User'是不同的車型在您的應用程序。因此'authenticate_user'需要用戶登錄而不是管理員。你有沒有考慮將管理員建模爲普通用戶,但是使用'admin = true'標誌? – spickermann

+0

@spickermann我選擇了使用devise創建多個模型的方式,而不是創建一個User模型並擁有一個admin屬性。所以我假設你說before_action:authenticate_user!部分代碼應該改成別的東西? – Robert

回答

2

authenticate_user檢查User是否已登錄或重定向到sign_in_path。以類似的方式,authenticate_admin將檢查Admin

由於您的應用程序旨在允許不同型號登錄,因此您無法使用這些devise方法。相反,您需要編寫自己的方法,在重定向之前檢查兩者。

類似以下內容可能會爲你工作:

before_action :authenticate_admin_or_user 

private 

def authenticate_admin_or_user 
    redirect_to(sign_in_path_path) unless admin_signed_in? || user_signed_in? 
end 
相關問題