2017-07-26 48 views
0

我正在運行Rails 5.1.2和Ruby 2.4.0。通過設計破壞會話「無法找到用戶'id'= sign_out」

我在ApplicationController中創建了一個名爲require_login的方法,該方法檢查用戶是否按順序登錄。當且僅當它們沒有登錄時,它們才被轉發到登錄頁面。

的問題是,當我簽下他們的時候,我得到以下錯誤

ActiveRecord::RecordNotFound at /users/sign_out 
Couldn't find User with 'id'=sign_out 

隨着罪魁禍首線是:從我的UserController的

def show 
    @user = User.find(params[:id]) # right here 
    authorize @user 
end 

這是我的代碼:

的ApplicationController

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :configure_permitted_parameters, if: :devise_controller? 
    include Pundit 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:name]) 
    end 

    def require_login 
    unless signed_in? 
     flash[:error] = "You must be logged in to access this section" 
     redirect_to login_path # halts request cycle 
    end 
    end 

end 

UsersController

class UsersController < ApplicationController 
    before_action :require_login 

    def index 
    @users = User.all 
    authorize User 
    end 

    def show 
    @user = User.find(params[:id]) 
    authorize @user 
    end 

    def update 
    @user = User.find(params[:id]) 
    authorize @user 
    if @user.update_attributes(secure_params) 
     redirect_to users_path, :notice => "User updated." 
    else 
     redirect_to users_path, :alert => "Unable to update user." 
    end 
    end 

    def destroy 
    user = User.find(params[:id]) 
    authorize user 
    user.destroy 
    redirect_to users_path, :notice => "User deleted." 
    end 

    private 

    def secure_params 
    params.require(:user).permit(:role) 
    end 

end 

佈局/ topnav.html.erb如果有人可以登出

<div class="row border-bottom"> 
    <nav class="navbar navbar-static-top white-bg" role="navigation" style="margin-bottom: 0"> 
     <div class="navbar-header"> 
      <a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i class="fa fa-bars"></i> </a> 
      <form role="search" class="navbar-form-custom" method="post" action="/"> 
       <div class="form-group"> 
        <input type="text" placeholder="Search for something..." class="form-control" name="top-search" id="top-search" /> 
       </div> 
      </form> 
     </div> 
     <ul class="nav navbar-top-links navbar-right"> 
      <li> 
       <%= link_to 'Sign out', destroy_user_session_path, :method=>'delete' %> 
      </li> 
     </ul> 
    </nav> 
</div> 

的routes.rb

Rails.application.routes.draw do 
    root to: 'visitors#index' 
    devise_for :users 
    resources :users 


    get "home/index" 
    get "home/minor" 
    root to: 'home#index' 

end 

而且rake routes輸出以下:

    Prefix Verb URI Pattern     Controller#Action 
        root GET /       visitors#index 
     new_user_session GET /users/sign_in(.:format)  devise/sessions#new 
      user_session POST /users/sign_in(.:format)  devise/sessions#create 
    destroy_user_session DELETE /users/sign_out(.:format)  devise/sessions#destroy 
     new_user_password GET /users/password/new(.:format) devise/passwords#new 
     edit_user_password GET /users/password/edit(.:format) devise/passwords#edit 
      user_password PATCH /users/password(.:format)  devise/passwords#update 
         PUT /users/password(.:format)  devise/passwords#update 
         POST /users/password(.:format)  devise/passwords#create 
cancel_user_registration GET /users/cancel(.:format)  devise/registrations#cancel 
    new_user_registration GET /users/sign_up(.:format)  devise/registrations#new 
    edit_user_registration GET /users/edit(.:format)   devise/registrations#edit 
     user_registration PATCH /users(.:format)    devise/registrations#update 
         PUT /users(.:format)    devise/registrations#update 
         DELETE /users(.:format)    devise/registrations#destroy 
         POST /users(.:format)    devise/registrations#create 
        users GET /users(.:format)    users#index 
         POST /users(.:format)    users#create 
       new_user GET /users/new(.:format)   users#new 
       edit_user GET /users/:id/edit(.:format)  users#edit 
        user GET /users/:id(.:format)   users#show 
         PATCH /users/:id(.:format)   users#update 
         PUT /users/:id(.:format)   users#update 
         DELETE /users/:id(.:format)   users#destroy 
        page GET /pages/*id      high_voltage/pages#show 

我能爲了一個人做的就是轉發到登錄頁面,如果他們沒有經過身份驗證,我怎麼可能銷燬他們的會話,以便他們在註銷時將他們正確地轉發到登錄頁面?

+0

你可以發佈你的'config/routes.rb'嗎? –

+0

向我們展示您的路線。 – Pavan

+0

@ m.simonborg routes.rb發佈!對於那個很抱歉。 – beckah

回答

1

resources :usersdevise_for :users是衝突如此

試試下面的代碼:

的routes.rb

Rails.application.routes.draw do 
    root to: 'visitors#index' 
    devise_for :users 
    #resources :users //comment the users resources because its already used by devise_for or used some other resources for users 


    get "home/index" 
    get "home/minor" 
    root to: 'home#index' 

end 

此外,在config/initalizer/devise.rb文件

變化config.sign_out_via = :deleteconfig.sign_out_via = :get

+0

這會導致'沒有路由匹配[GET]「/ users/sign_out」'不幸 – beckah

+0

運行'rake routes'並顯示結果 – puneet18

+1

goto'config/initalizer/devise.rb'並更改行'config.sign_out_via =:delete 'to'config.sign_out_via =:get' – puneet18

0

你已經做好了一切。唯一缺失的是:method => :delete呼叫。這是軌道專用,你需要rails-ujs或更舊的rails版本jqeury_ujs使其工作。

添加到您的應用程序/資產/ javascripts /應用程序。JS

# for rails 5.1 or higher 
//= require rails-ujs 

# for rails 5.0 or lower 
//= require jquery 
//= require jquery_ujs 

如果不加這一點,method: :delete通話將無法正常工作。如果您完全不想使用它,請更改sign_out以使用GET

更改或添加到您的配置/初始化/ devise.rb

config.sign_out_via = :get 

如果仍然沒有工作,那麼你必須在你的的config/routes.rb中文件錯誤的順序。 devise_for :users必須在resources :users之前:

devise_for :users 
resources :users