ruby-on-rails - 如何从模型内访问 session 信息?

标签 ruby-on-rails session model

this person如此 Eloquent 地说:

You’re completely [...] wrong if you want to access sessions, params, cookies, etc. in your Models.

但是,我认为我对此有合理的理由 - 如果没有,请让我知道不同的方法。

当用户在网站上注册时,我使用 KeenIO api 发布事件。未登录,但注册。一个全新的用户。

# Controller code:
@user = User.find_or_create_for_github_oauth(request.env["omniauth.auth"], current_user)

# Model method:
user = User.find_by(email: auth_hash['info']['email'])
if user.nil? # User is brand new, bla bla bla.
  Keen.publish(:account_registration_au, { user_session: { session_id: session.id } })
end

如何从我的模型中访问 session 信息?我正在尝试创建一个 Keen Funnel,并且需要该 session ID 来通过我的漏斗步骤跟踪用户。

最佳答案

我喜欢用下图来描述 MVC 模式:

因此,您要编写一些 Web 应用程序。毫无疑问,任何应用程序最重要的部分都是数据——没有任何数据的Web应用程序只是一个静态网站。因此,您的数据使您的网站独一无二,也是客户访问该网站的首要原因。

现在想象一下你的数据是生活在一个遥远星球上的一些奇怪的动物 - 那里生活着一个完整的小型生态系统:巨大的文章正在缓慢地行走,一堆评论在他们的脚下奔跑,作者正在喂食这是你的应用程序的领域 - 这是事实。模型就是真理。在这里你就像上帝一样。

现在您正在那个世界中构建您的应用程序。你必须在里面 build 一个小村庄。它将有自己的邮局(服务器)和几座称为 Controller 的小建筑。当新请求到来时,您的邮局将读取其地址并将其传递给正确的 Controller 。现在, Controller 中的人员将读取该消息,并决定他们需要一些数据来处理它 - 狩猎队被召集,他们去丛林捕捉它。 (实际上他们只是拍了一张照片,除非你强制执行悲观锁定,说来话长)。该数据经过处理并传递给控制秘书,后者将处理后的数据(完全不知道它是什么 - 这不是他的工作)粘贴到准备好的模板中。然后将其返回到邮局以作为响应发回。

这里需要注意的重要事项:

  1. Controller 是应用程序的核心,隐藏在模型的广阔区域中。
  2. 模型不关心您的应用程序。无论有没有它,他们都会像他们一样生活。
  3. 您不希望一些山羊在您 Shiny 的办公室周围徘徊,是吗?

如果您想塑造现有的生态系统,将特定于应用程序的数据传递给模型就很好。然而,让模型访问 session 或 cookie 等应用程序控件是非常危险的。将 Controller 实例传递给模型就像派动物园管理员去喂野生老虎。

除此之外,向模型提供额外的应用程序数据将使它们依赖于应用程序,并且当您打开控制台时,它们将无法生存。

关于ruby-on-rails - 如何从模型内访问 session 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29101320/

相关文章:

asp.net - FOSS ASP.Net session 复制解决方案?

c# - @Html.EditorFor DateTime 在为其设置默认值时不显示

mysql - 如果找不到记录,如何通过扩展模型对 Rails 中的存档进行额外搜索?

ruby-on-rails - 将 JSON 嵌套到事件记录中

ruby-on-rails - 如何使用 RSpec 和 Devise/CanCan 进行集成测试?

ruby-on-rails - AcitveRecord 不会接受_nested_attributes_for 具有嵌套现有记录的新关联记录

ruby-on-rails - 带有 Memcache 的 Rails 返回错误的缓存对象?

ruby-on-rails - 通过具有相同值的不同列进行查询

javascript - 在 javascript 中更新 Django session 变量?

java - 实体类 Netbeans 8.2 的 session Bean