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

发布于 2024-10-15 08:19:09 字数 141 浏览 4 评论 0 原文

据我所知,助手通常无法在控制器中访问。但为什么要对实例变量 @current_user 进行所有包装呢?

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

I understand that the helpers are not generally accessible in controllers. But why all the wrapping around a instance variable @current_user?

Why does the helper have "current_user=" and "current_user" defined as methods? Why can @current_user be all that is needed for this section?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

安静 2024-10-22 08:19:09

我认为你需要继续阅读。从正文来看:

如果我们这样做,我们将有效地复制 attr_accessor 的功能,该功能首次出现在第 4.4.5 节中,并用于在第 7.1.1.8 节中制作虚拟密码属性。问题是它完全无法解决我们的问题:清单 9.15 中的代码会忘记用户的登录状态:一旦用户转到另一个页面(噗!),会话就会结束,用户将自动注销。

为了避免这个问题,我们可以找到cookie对应的session用户...

I think you need to continue reading. From the text:

If we did this, we would effectively replicate the functionality of attr_accessor, first seen in Section 4.4.5 and used to make the virtual password attribute in Section 7.1.1.8 The problem is that it utterly fails to solve our problem: with the code in Listing 9.15, the user’s signin status would be forgotten: as soon as the user went to another page—poof!—the session would end and the user would be automatically signed out.

To avoid this problem, we can find the session user corresponding the cookie...

睡美人的小仙女 2024-10-22 08:19:09

我有同样的问题。是的,我认为 current_user 的结构是为了防止代码复制。但我也认为这可能是一个语法问题。如果您将 current_user 设置为 SessionHelper 的公共属性,(我认为)您可以使用 SessionHelper.current_user 访问它,但是如果您定义 current_user > 方法和 current_user=(user) 方法,您可以使用 current_user 属性,而不会产生额外的混乱。

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

I have the same question. Yes, I think that current_user is structured this way to prevent code replication. But I also think it might be a syntax issue. If you made current_user a public property of SessionHelper, (I think) you'd access it with SessionHelper.current_user, but if you define a current_user method, and a current_user=(user) method, you can use the current_user property without the extra clutter.

So, I think it's just a style issue. Your approach works fine too.

⒈起吃苦の倖褔 2024-10-22 08:19:09

我确实从同事那里得到了很好的答案。

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= 方法。我看不出有什么理由不使用实例变量进行赋值。

I did get a good answer from a co-worker.

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

It is a refactor issue. You don't want to replicate the code from current user everywhere.

I still think the current_user= method is not needed. I don't see a reason not to use the instance variable for assignment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文