2017-07-26 66 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