需要澄清,为什么包装方法? Ruby on Rails教程第9章第9.3.3节当前用户 -

时间:2011-02-01 20:46:45

标签: ruby-on-rails ruby-on-rails-3 helpers

据我所知,助手通常无法在控制器中访问。但为什么围绕一个实例变量@current_user?

为什么帮助器将“current_user =”和“current_user”定义为方法?为什么@current_user可以满足本节所需的全部内容?

3 个答案:

答案 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属性,而不会产生额外的混乱。

所以,我认为这只是一个风格问题。你的方法也很好。