在Rails 5中,如何访问模型或助手中的cookie方法?

jpw*_*ynn 2 cookies ruby-on-rails

一个如何访问Rails模型或助手中的cookie?

为了弄干某些控制器方法,我试图将对cookie()的多个控制器调用移到application_helper.rb和/或模型中。

在application_helper.rb中什么不起作用:

cookies[:foo]
ActionDispatch::Cookies.cookies[:foo]
ActionController.cookies[:foo]
ActionDispatch::Cookies::ChainedCookieJars.cookie[:foo]
Run Code Online (Sandbox Code Playgroud)

所有这些都会导致未定义的方法“ cookies”

注意:只是在反省MVC教义的好意的答案在这里错了地方……我已经设计了足够长的时间(数十年),以了解何时在MVC线之外进行着色(如果可能)是更好的方法。但是即使在深入了解Rails源代码之后,精确的语法仍使我难以理解。这个问题是由某种复杂情况引起的,这种情况尤其涉及跨域ajax环境中浏览器对Cookie的不一致处理,该环境有时包括本地文件(Chrome拒绝管理cookie)。

Vas*_*ili 6

这不是一个好主意:)模型是类,它们不应该知道Web级别上正在发生的事情,这就是为什么cookies在中实现method 的原因ActionController,但在ActionModel或中没有这样的实现ActionHelper。如果您需要模型中的cookie值,则从控制器传递一个值。这是应该做的。

  • @jpwynn如​​果相同的代码部分“在3个不同的控制器和5个或6个不同的视图中出现20次”,则可能是您的代码有异味,并且您在做错什么。如果我看到了您的代码,我将给出如何重构它的建议。您总是可以实施服务,甚至单例服务来完成这项工作。相信我,有一种方法,仅在`ActionController`中实现`cookies`方法的人们并不愚蠢,偶尔也不会这样做。否决票是错误的答案。您不赞成这样做是因为您不知道如何改善实施。 (3认同)
  • 那么,在 3 个不同的控制器和 5 或 6 个不同的视图中出现 20 次的 cookies[:foo] == "somevalue" 代码应该放在哪里呢? (2认同)