据我所知,助手通常无法在控制器中访问。但为什么围绕一个实例变量@current_user?
为什么帮助器将“current_user =”和“current_user”定义为方法?为什么@current_user可以满足本节所需的全部内容?
答案 0 :(得分:0)
我认为你需要继续阅读。从文字:
如果我们这样做,我们将有效地复制attr_accessor的功能,首先见4.4.5节,并用于制作7.1.1.8节中的虚拟密码属性问题是它完全无法解决我们的问题:在清单9.15中的代码中,用户的登录状态将被忘记:一旦用户转到另一个页面! - 会话将结束,用户将自动退出。
为了避免这个问题,我们可以找到对应cookie的会话用户......
答案 1 :(得分:0)
我确实从一位同事那里得到了一个很好的答案。
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
self.current_user = user
end
end
def current_user
@current_user ||= user_from_remember_token
end
这是一个重构问题。您不希望从任何地方复制当前用户的代码。
我仍然认为不需要current_user=
方法。我没有看到不使用实例变量进行赋值的原因。
答案 2 :(得分:0)
我有同样的问题。是的,我认为current_user的结构是这样的,以防止代码复制。但我也认为这可能是一个语法问题。如果您使current_user成为SessionHelper
的公共属性,(我认为)您可以使用SessionHelper.current_user
访问它,但是如果您定义current_user
方法和current_user=(user)
方法,您可以使用current_user
属性,而不会产生额外的混乱。
所以,我认为这只是一个风格问题。你的方法也很好。