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

Ruby on rails 如何从模型中访问会话信息?,ruby-on-rails,session,model,Ruby On Rails,Session,Model,正如雄辩地说的那样: 如果您想访问模型中的会话、参数、cookie等,那么您完全[…]错了 然而,我认为我有理由这样做——如果没有,请让我知道另一种方法 当用户在网站上注册时,我使用KeenIO api发布一个事件。不是登录,而是注册。一个全新的用户 # Controller code: @user = User.find_or_create_for_github_oauth(request.env["omniauth.auth"], current_user) # Model method:

正如雄辩地说的那样:

如果您想访问模型中的会话、参数、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


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

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

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

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

现在,您正在这个世界上构建应用程序。你必须在里面建一个小村庄。它将拥有自己的邮局(服务器)和两座称为控制器的小型建筑。当新的请求到来时,您的邮局将读取其地址并将其传递给正确的管理员。现在,控制器中的人员将阅读消息,并决定他们需要一些数据来处理它-狩猎队被呼叫,他们去丛林捕捉它。(事实上,他们只是拍了一张照片,除非你实施悲观锁定,说来话长)。该数据被处理并传递给财务总监秘书,财务总监秘书将处理后的数据粘贴到一个现成的模板上(完全不知道它是什么,这不是他的工作)。然后,这些信息会返回到邮局,作为回复发送回去

此处需要注意的重要事项:

  • 控制器是应用程序的核心,隐藏在模型的广阔平面中
  • 模型不适合您的应用程序。不管有没有它,他们都会照样生活
  • 你不想让一些山羊在你闪亮的办公室里闲逛,是吗
  • 若您想要塑造现有的生态系统,那个么将特定于应用程序的数据传递给模型是很好的。然而,让模型访问诸如会话或cookie之类的应用程序控件是非常危险的。将控制器实例传递给模型就像发送动物园的主管喂野生老虎一样


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

    我不生气,但有人会生气,所以我删除了一些可能被认为是这样的语言为什么不将session.id作为参数传递给控制器中的\u github\u oauth以查找\u或\u create\u?是的,我可以这样做,但可能有不同的方法。我并不急于部署这个补丁,所以我想我应该把问题抛到一边。如果我的对象中需要一个控制器上下文,我通常会将它自己传递给控制器。但它不是ActiveRecord模型,而是一种特殊形式的模型。在MVC结构中,您的模型应该始终与控制器无关。如果需要将某些特定于控制器的详细信息传递给模型,请将其作为附加属性传递。我并不是说这是唯一的方法——这种方法可以在将来为你省下很多麻烦。我无法想象任何人的天空