如何从模型中访问会话信息?

时间:2015-03-17 14:11:23

标签: ruby-on-rails session model

正如this person雄辩地说的那样:

  

如果您想在模型中访问会话,参数,Cookie等,则完全错误。

但是,我认为我有合理的理由 - 如果没有,请告诉我一个不同的方法。

当用户在网站上注册时,我使用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

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

1 个答案:

答案 0 :(得分:2)

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

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

现在想象你的数据是生活在遥远星球上的一些奇怪的动物 - 那里有一个完整的小生态系统:巨大的物品走得很慢,一堆评论在他们的脚下运行,作者正在喂食在upvotes等。这是你的应用程序的领域 - 这是事实。模型是事实。而你就像上帝一样。

现在,您正在构建该应用程序。你必须建一个小村庄。它将拥有自己的邮局(服务器),以及一些称为控制器的小型建筑。当新请求进入时,您的邮局将读取其地址并将其传递给正确的控制器。现在,控制器中的人员将阅读该消息并决定他们需要一些数据来处理它 - 狩猎团队被召唤并且他们会去丛林捕捉它。 (实际上他们只是拍一张照片,除非你强制执行悲观锁定,长篇故事)。这些数据被处理并传递给控制器​​秘书,后者将这些处理过的数据(绝对不知道它是什么 - 不是他的工作)粘贴到准备好的模板上。然后返回邮局作为回复发回。

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

  1. 您的控制器是您应用程序的核心,隐藏在您模型的广阔空间中。
  2. 型号不关心您的应用。无论是否生活,他们都会生活。
  3. 你不想让一些山羊想到你闪亮的办公室,是吗?
  4. 如果您想要塑造现有的生态系统,那么将特定于应用程序的数据传递给模型就可以了。但是,为模型提供对会话或cookie等应用程序控件的访问权限是非常危险的。将控制器实例传递给模型就像送动物园的主管喂养野生老虎一样。

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