2017-06-07 65 views
-1

我有這樣的路線:如何識別用戶會話? Rails的

Rails.application.routes.draw do 

    root 'login#new' 
    get '/home/inicio', to: 'home#index' 

    scope '/login' do 
    get '/acesso', to:'login#new' 
    post '/acessorecebendo', to:'login#create', as:'user' 
    get '/sair', to:'login#destroy' 
    end 

    resources :login 
    resources :home 
    resources :produtos 
    resources :fornecedors 
end 

登錄控制器:

class LoginController < ApplicationController 
    protect_from_forgery 

    def new 
    if session[:user] 
     @user = User.find(session[:user]) 
    end 
    end 

    def destroy 
    reset_session 
    redirect_to "/login/acesso", notice: "Você foi deslogado" 
    end 

    def create 
    user = User.validate(login_params[:email], login_params[:senha]) 

    if user 
     session[:user] = user.id 
     redirect_to "/home/inicio", notice: "login feito com sucesso" 
    else 
     redirect_to "/login/acesso", notice: "Dados incorretos" 
    end 
    end 

    private 
    def login_params 
    params.require(:login).permit(:email, :senha) 
    end 
end 

家庭控制器:

class HomeController < ApplicationController protect_from_forgery with: :exception 

    def new 
    @user = User.find_by(id: session[:user]) end 

    def index 
    @produtos = Produto.all 
    render 'inicio' end 

    def show 
    if session[:user] 
     @user = User.find(session[:user]) 
    end end end 

我得到的主頁視圖錯誤(新。 html.erb):

<header> 
    <h2><a href="#">Bem-vindo <%= @user.nome %></a></h2> 
    <nav> 

未定義的方法`諾姆」的零:NilClass

爲什麼我有一些問題的會議?我可以做登錄,我想在重定向頁面上看到此會話的用戶信息,就像我可以將登錄操作上分配的@user變量傳遞給家庭控制器以使用它一樣。

+0

再次問候。這是什麼??? '@user = @user = User.find(session [:user])'。另外,您需要一個'new'操作來設置用戶。 – jvillian

+0

哦,這是一個錯誤,當我發短信的這個職位... 我的老師是可怕的:\\ 但你的意思是一個新的行動?我已更新該帖子。 –

+0

您的身份驗證方法存在嚴重缺陷 - 您只是將用戶的ID存儲在會話Cookie中?您應該使用每次用戶登錄或註銷時都會重置的令牌。有了這個方法,有人冒充其他用戶真的很微不足道,而會話令牌可以被重複使用很多時間... 這就是說。我們可以看到'User :: validate'的代碼嗎? – OneNeptune

回答

0

發生這種情況是因爲@user僅在索引和顯示中設置,但您試圖從新操作引用它。

考慮這個邏輯移動到before_action

class HomeController < ApplicationController 
    before_action if: ->{ session[:user] } do 
    @user = User.find_by(id: session[:user]) 
    end 
end 

如果控制器需要假設@user存在,你也應該有一個before_action,處理丟失的用戶帳戶的情況。我通常會將此行爲放入AuthenticatedController類中,並在需要時從中繼承。

User.find在這裏並不是最佳選擇,因爲如果沒有找到記錄,它將引發異常。

+0

你爲什麼說「試圖從新行動中引用它」?路線獲取'/ home/inicio',爲:'home#index',所以在索引操作中,我呈現了我正在嘗試使用@user變量值的視圖。 –

+0

@MikhaelAraujo'/ home/inicio'鏈接到'home#index',因此默認使用'index.html.erb'。你的例子顯示'new.html.erb'是罪魁禍首,你的控制器代碼並沒有顯式地顯示它,所以我必須假定它是由'HomesController#new'動作渲染的。這條路線由'資源:家'連接起來。 –