我有这条路线:
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变量传递给家庭控制器来使用它。
答案 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
在这里不是最佳选择,因为如果没有找到记录,它将抛出异常。