Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 登录/注册功能不工作,@当前用户不工作,会话不工作_Ruby On Rails_Ruby_Session_Login_Session Cookies - Fatal编程技术网

Ruby on rails 登录/注册功能不工作,@当前用户不工作,会话不工作

Ruby on rails 登录/注册功能不工作,@当前用户不工作,会话不工作,ruby-on-rails,ruby,session,login,session-cookies,Ruby On Rails,Ruby,Session,Login,Session Cookies,我是Rails新手,正在开发一个实践应用程序,其中包含一个简单的登录功能。我一直在遵循CodeAcademy的教程,但是代码在很多方面都不起作用。首先,会话不会被设置,即使Rails正在执行与会话声明共享的“if”块中的其余代码(顺便说一句,不会返回错误) 会话控制器: class SessionsController < ApplicationController def new end def create @user = User.find_by_username(

我是Rails新手,正在开发一个实践应用程序,其中包含一个简单的登录功能。我一直在遵循CodeAcademy的教程,但是代码在很多方面都不起作用。首先,会话不会被设置,即使Rails正在执行与会话声明共享的“if”块中的其余代码(顺便说一句,不会返回错误)

会话控制器:

class SessionsController < ApplicationController
  def new

  end

 def create
  @user = User.find_by_username(params[:session][:name])
  if @user && @user.authenticate(params[:session][:password])
    session[:user_id] = @user.id
    redirect_to '/posts'
  else
    session[:user_id] = nil
    flash[:warning] = "Failed login- try again"
    redirect_to '/login'
  end 
end

  def destroy
session[:session_id] = nil 
redirect_to login_path 
  end
end 
class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end
class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end
helper_method :current_user
class sessioncontroller
从这个问题推断,我的“current_user”函数不起作用,这很可能是因为没有设置会话

应用程序控制器:

class SessionsController < ApplicationController
  def new

  end

 def create
  @user = User.find_by_username(params[:session][:name])
  if @user && @user.authenticate(params[:session][:password])
    session[:user_id] = @user.id
    redirect_to '/posts'
  else
    session[:user_id] = nil
    flash[:warning] = "Failed login- try again"
    redirect_to '/login'
  end 
end

  def destroy
session[:session_id] = nil 
redirect_to login_path 
  end
end 
class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end
class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end
helper_method :current_user
class ApplicationController
非常感谢您的帮助。如果你还需要看别的东西,请告诉我


注:我知道我应该使用Desive,我正计划在我的未来进行更严肃的项目。然而,正如我所说,这是一个练习/测试应用程序,有助于发展我的编码技能,在使用“神奇”宝石般的设计之前,我想亲自体验一下登录系统。

我认为错误在于会话控制器无法找到当前的用户

在应用程序控制器中编写以下代码:

class SessionsController < ApplicationController
  def new

  end

 def create
  @user = User.find_by_username(params[:session][:name])
  if @user && @user.authenticate(params[:session][:password])
    session[:user_id] = @user.id
    redirect_to '/posts'
  else
    session[:user_id] = nil
    flash[:warning] = "Failed login- try again"
    redirect_to '/login'
  end 
end

  def destroy
session[:session_id] = nil 
redirect_to login_path 
  end
end 
class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end
class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end
helper_method :current_user
class ApplicationController

让我知道它是否有效

可能存在一些问题

首先,在调用
当前用户
方法之前,不会设置
@current\u user
。正如@Neha所指出的,您需要向应用程序控制器添加一个helper方法,以便您的所有视图都可以访问当前用户的
方法。将此行添加到ApplicationController:

class SessionsController < ApplicationController
  def new

  end

 def create
  @user = User.find_by_username(params[:session][:name])
  if @user && @user.authenticate(params[:session][:password])
    session[:user_id] = @user.id
    redirect_to '/posts'
  else
    session[:user_id] = nil
    flash[:warning] = "Failed login- try again"
    redirect_to '/login'
  end 
end

  def destroy
session[:session_id] = nil 
redirect_to login_path 
  end
end 
class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end
class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end
helper_method :current_user
现在,为了诊断问题,让我们设置一些东西,让您能够了解会话和当前用户

首先,在
视图/layouts/application.html.erb
中,在显示
的行后面添加以下内容:

<%= render 'layouts/footer' %>
现在,在每个视图的底部都可以看到会话的详细信息

会话#create
操作中,您在查找用户时可能会遇到问题。您使用的是
params[:session][:name]
,您可能应该使用
params[:session][:username]

另外,切题来说,销毁会话的正确方法不是将
session[:id]
设置为nil,而是使用
reset\u session
。因此,您的SessionController应该如下所示:

class SessionsController < ApplicationController
  def new
  end

  def create
    @user = User.find_by_username(params[:session][:username])
    if @user && @user.authenticate(params[:session][:password])
      session[:user_id] = @user.id
      redirect_to '/posts'
    else
      session[:user_id] = nil
      flash[:warning] = "Failed login- try again"
      redirect_to '/login'
    end
  end

  def destroy
    reset_session
    redirect_to login_path
  end
end
class sessioncontroller
@moveson尝试了这个方法,但仍然无法将其设置为会话[:user\u id]即可……。在什么时候调用当前的用户方法?我可以发布视图