Ruby on rails 登录/注册功能不工作,@当前用户不工作,会话不工作
我是Rails新手,正在开发一个实践应用程序,其中包含一个简单的登录功能。我一直在遵循CodeAcademy的教程,但是代码在很多方面都不起作用。首先,会话不会被设置,即使Rails正在执行与会话声明共享的“if”块中的其余代码(顺便说一句,不会返回错误) 会话控制器: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(
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]即可……。在什么时候调用当前的用户方法?我可以发布视图