如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 中的人员将读取该消息,并决定他们需要一些数据来处理它 - 狩猎队被召集,他们去丛林捕捉它。 (实际上他们只是拍了一张照片,除非你强制执行悲观锁定,说来话长)。该数据经过处理并传递给控制秘书,后者将处理后的数据(完全不知道它是什么 - 这不是他的工作)粘贴到准备好的模板中。然后将其返回到邮局以作为响应发回。
这里需要注意的重要事项:
- Controller 是应用程序的核心,隐藏在模型的广阔区域中。
- 模型不关心您的应用程序。无论有没有它,他们都会像他们一样生活。
- 您不希望一些山羊在您 Shiny 的办公室周围徘徊,是吗?
如果您想塑造现有的生态系统,将特定于应用程序的数据传递给模型就很好。然而,让模型访问 session 或 cookie 等应用程序控件是非常危险的。将 Controller 实例传递给模型就像派动物园管理员去喂野生老虎。
除此之外,向模型提供额外的应用程序数据将使它们依赖于应用程序,并且当您打开控制台时,它们将无法生存。
关于ruby-on-rails - 如何从模型内访问 session 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29101320/