在 ruby​​ 中创建登录会话时理解“current_user”概念

2024-06-19

我正在阅读很棒的 Michael Hartl 教程来构建 ruby​​ 应用程序here http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec%3acurrent_user.

我试图理解如何创建会话的概念,但我一直在理解这一行:

self.current_user = user

在这个方法中:

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end
end

我理解使用 user_token 创建 cookie 的整个概念。

但我不明白是什么意思 self.current_user = user 意味着以及为什么有必要保留这行代码 - 我有带有令牌的 cookie - 为什么我需要知道当前用户?

另外,这个“自我”存储在哪里 - 它不像flash[:success]参数我可以在我的视图之一中看到。所以我不明白它在哪里。

同一模块中还有这两种方法:

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end 

我仍然试图将这个神秘的目的的各个点联系起来current user- 其目的是创造@current_user在视图中使用的全局变量?

如果是这样-为什么有这两个重复的功能def current_user=(user) and def current_user


一些东西。

首先,您读错了方法名称(考虑到 ruby​​ 方法命名的神秘性,这并不奇怪)。def current_user=(user)实际上被理解为定义方法current_user=这需要一个论点user, 然而def current_user定义一个方法current_user这不需要争论。这些分别称为setters and getters.

这是一个参考:Ruby(编程语言):Ruby 中的 setter 和 getter 是什么? http://www.quora.com/Ruby-programming-language/What-are-setters-and-getters-in-Ruby

这就解释了重复的情况。继续你的下一个问题。

我不明白 self.current_user = user 是什么意思

self本身就是一个话题,值得单独讨论,所以我什至不会尝试解释它(这里是一份参考 http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/从许多中)。出于这个问题的目的,重要的是要记住,为了设置实例变量,您需要在赋值前加上前缀self,即使在类中(出于其他目的它会是隐式的)。该行的其余部分是对current_user=我上面提到的 setter 方法,带有参数user.

为什么有必要保留这行代码 - 我有带有令牌的 cookie - 为什么我需要知道当前用户?

之所以有必要,是因为您不想每次需要获取当前用户时都从令牌中查找用户。看一下getter方法:

def current_user
  @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end

这说明的是:如果我没有查找并设置实例变量@current_user然而,然后查一下;如果我已经设置了,那么就返回它。这样就省去了很多查找的麻烦。

我认为这回答了你的问题。还有很多更深层次的问题(self等),您可以在其他地方找到更多信息。这是关于为什么需要包含的一个讨论self在 SO 的设置器中:为什么 Ruby setter 需要“自我”。班级内的资格? https://stackoverflow.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class

更新:小澄清,关于使用的最后一个链接selffor class 中的 setter 实际上有点偏离主题,因为您是在模块中调用它,而不是直接从类中调用它。在模块的上下文中,self in self.current_user = user将成为该模块包含在其中的类,例如User.current_user如果在类内调用User等等。这又是另一个讨论话题......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ruby​​ 中创建登录会话时理解“current_user”概念 的相关文章

随机推荐

  • 如何向 ExtJS 应用添加自定义字体?

    同事 请建议如何向 ExtJS 添加自定义字体 以便它与应用程序一起加载 如果用户的系统中没有安装此字体 必须将其加载到哪个文件夹 以及应将其包含在何处以及如何包含 谢谢各位的解答 您只需添加新的字体文件即可myApp resources
  • 如何让 PowerShell 等待 Invoke-Item 完成?

    如何让 PowerShell 等待 Invoke Item 调用完成 我正在调用一个不可执行的项目 因此我需要使用 Invoke Item 来打开它 只需使用Start Process wait 例如Start Process wait c
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出
  • 在 Chrome 中,应用于包含图像的锚点的轮廓高度不正确

    对于我正在开发的网站 我希望当链接聚焦 悬停 活动时 链接周围会出现虚线轮廓 我希望文本和图像链接发生这种情况 我遇到的问题是 虽然我的代码在 Firefox 和 IE 中运行良好 但在 Chrome 7 0 517 41 中 虚线轮廓与我
  • 带数据透视表的 Laravel 查询生成器

    我有两个带有数据透视表的表 Table tours id name country id featured Table countries id name 数据透视表country tour id country id tour id 我想
  • Jasmine 测试中模拟 window.location.reload

    我创建了一个window location reload我的 JavaScript 中的函数 我需要在 Jasmine 中测试时模拟重新加载函数 因为它不断循环 当我跑步时测试进展顺利grunt jenkins 但在浏览器 mozilla
  • 如何通过 COM 将长数组从 VB6 传递到 C#

    我需要将 int 或 long 数组 无关紧要 从 VB6 应用程序传递到 C COM Visible 类 我尝试在 C 中声明接口 如下所示 void Subscribe MarshalAs UnmanagedType SafeArray
  • 如何强制串行端口写入方法在发送数据之前等待线路清除?

    以下是我正在尝试做的一些背景 打开从移动设备到蓝牙打印机的串行端口 将 EPL 2 表格发送到蓝牙打印机 以便它了解如何处理即将接收的数据 收到表格后 将一些数据发送到打印机 这些数据将打印在标签纸上 根据需要多次重复步骤 3 打印每个标签
  • 即使没有结果也返回一个值

    我有这种简单的查询 它返回给定 id 的非空整数字段 SELECT field1 FROM table WHERE id 123 LIMIT 1 问题是如果找不到 id 结果集就是空的 我需要查询始终返回一个值 即使没有结果 我有这个东西工
  • 如何使用div绘制曲线?

    我需要使用 CSS 绘制两条曲线 我尝试过组装一些divs 使用CSSborder radius绘制弧形面板 但结果很糟糕 还有更好的算术吗 正如我之前在评论中提到的 请不要使用CSS用于实现复杂的曲线和形状 虽然仍然可以使用 CSS 来实
  • 添加 Google Play Services 9.0.0 后 Dex 文件超过 64k

    我按照 Firebase 指南添加 FCM 因此我将以下依赖项添加到我的应用程序 gradle 中 compile com google android gms play services 9 0 0 apply plugin com go
  • 重新渲染列表模板导致页面滚动到顶部

    我有一些模板 大致如下所示
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

    我对 SSE 编码非常陌生 我想将 int32 类型的 m128i 4 的结果存储到 int8 类型的 m128i 中 m128i j i32 k 的值均在 127 和 127 之间 我认为伪代码如下 result i8 vec1 i8 0
  • Ruby 在 Windows 上找不到 sqlite3 驱动程序

    我正在尝试在 Windows 上设置 Ruby on Rails 我正在使用看起来不错的 Flash Rails 发行版 但是 sqlite3 有一个问题 我发现线程告诉我安装版本 1 2 3 安装得很好 我使用的是 ruby 1 9 0
  • 程序堆栈真的会溢出吗?

    如果达到堆栈大小限制 处理器是否会导致操作系统出现 TRAP 从而防止堆栈溢出 P 我相信 Windows 确实有一个堆栈 当您到达末尾时它会增长 在 Visual Studio 编译器中 负责此操作的代码位于chkstk obj modu
  • C++11 容器/适配器属性的实用总结/参考? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找各种 C 11 标准容器和容器适配器的重要属性的全面总结 参考 也可以选择包括 boost Qt 但是按这些属性索引而不是通常的每个容器文档
  • 辍学训练

    如何对由 dropout 产生的许多薄层进行平均 在测试阶段要使用哪些重量 我对这个问题真的很困惑 因为每个细化层都会学习一组不同的权重 那么反向传播是为每个稀疏网络单独完成的吗 这些细化网络之间的权重究竟是如何共享的 因为在测试时仅使用一
  • 在 ASP.NET 中动态设置主题

    我有一个连接到不同域的应用程序 我没有复制和修改每个应用程序 而是在硬盘驱动器上使用相同的物理位置 但在 IIS 上使用单独的应用程序池和网站 基本上我想根据主机名更改主题 IE 用户访问 websome com 获取 websome 主题
  • 在 ruby​​ 中创建登录会话时理解“current_user”概念

    我正在阅读很棒的 Michael Hartl 教程来构建 ruby 应用程序here http ruby railstutorial org chapters sign in sign out sec 3acurrent user 我试图理