如何识别用户会话?导轨

时间:2017-06-07 00:03:37

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有这条路线:

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

我在主页视图(new.html.erb)上收到错误:

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

未定义的方法`nome&#39;为零:NilClass

为什么我在会话中遇到一些问题?我可以登录,我想在重定向的页面上看到此会话的用户信息,就像我可以将登录操作上分配的@user变量传递给家庭控制器来使用它。

1 个答案:

答案 0 :(得分: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在这里不是最佳选择,因为如果没有找到记录,它将抛出异常。