我正在尝试在Rails4中开发一个简单的登录/注销Web应用程序。我有以下会话助手的代码
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Returns the current logged-in user (if any).
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
# Forgets a persistent session.
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Logs out the current user.
def log_out
forget(current_user)
session.delete(:user_id)
@current_user = nil
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
end
当我尝试注销时,它会调用控制器功能"忘记"而不是辅助功能。这是会话控制器类的注销代码。
def destroy
log_out if logged_in?
redirect_to root_url
end
# Forgets a user.
def forget
update_attribute(:remember_digest, nil)
end
答案 0 :(得分:0)
那是对的。帮助程序混合到视图上下文中,而不是控制器上下文中,因此forget
帮助程序在控制器中不可用。即使这样,控制器类中直接定义的任何方法都将替换包含的mixin提供的方法。
为什么不简单地在控制器本身中定义遗忘方法?你需要在其他地方使用吗?
作为旁注,您在控制器中创建的forget
方法永远不会工作,因为您在没有接收器的情况下调用update_attribute
因此接收器将是控制器本身,而它应该是当前的用户实例。
您的代码非常混乱。在尝试构建应用程序之前,您可能还想阅读一些Ruby / Rails书籍/课程。