Ruby on rails 如何识别用户会话?轨道

Ruby on rails 如何识别用户会话?轨道,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,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'

我有以下几条路线:

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
class LoginController
主控制器:

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
class HomeController
我在主视图(new.html.erb)上遇到错误:


nil:NilClass的未定义方法“nome”


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

发生这种情况是因为您的
@user
仅在索引和显示中设置,但是你试图从新动作中引用它

考虑将此逻辑移动到

class HomeController{session[:user]}do
@user=user.find_by(id:session[:user])
结束
结束
如果此控制器需要假定存在
@user
,则您还应该有一个
before_action
,用于处理丢失用户帐户的情况。我通常将此行为放入
AuthenticatedController
类中,并在需要时从中继承


User.find
在这里不是最佳选择,因为如果找不到任何记录,它将抛出异常。

您好。这是什么<代码>@user=@user=user.find(会话[:user])
。另外,你需要一个
new
操作来设置用户。哦,我发这篇文章时这是一个错误。。。我的老师很可怕:\\但是你的新动作是什么意思?我已经更新了帖子。你的身份验证方法存在严重缺陷-你只是将用户id存储在会话cookie中?您应该使用在用户每次登录或注销时重置的令牌。使用此方法,模拟其他用户的操作非常简单,并且会话令牌可以在很长时间内重复使用。。。也就是说。我们可以看到
User::validate
的代码吗?为什么说“尝试从新操作引用它”?路由得到“/home/inicio”到:“home#index”,因此在索引操作中,我呈现了我试图使用@user variable value的视图。@MikhaelAraujo
/home/inicio
链接到
home#index
,因此默认情况下使用
index.html.erb
。您的示例将
new.html.erb
显示为罪魁祸首,并且您的控制器代码没有显式地呈现它,因此我必须假设它是由
homeController 35; new
操作呈现的。这条路线是由
资源:home
连接的。