从视图中设置一个cookie,然后从Rails中的Controller中读取它

Set a cookie from view, then read it from Controller in Rails

本文关键字:Rails 然后 中的 Controller 读取 一个 设置 视图 cookie      更新时间:2023-09-26

我想使用Javascript在Rails视图中设置cookie值,然后使用Controller读取这个cookie。Rails有可能做到这一点吗?我应该怎么做?

我的情况:我有一个输入字段(比如地址(,用户第一次来我的网站时需要填写。然后用户使用Omniauth登录。我想坚持地址,直到他登录后。

更新:我能够在客户端上添加到document.cookies。然而,cookies["something"]从Rails端返回nil。下面是cookie哈希:

#<ActionDispatch::Cookies::CookieJar:0x007 @secret="f4d518c0b2", @set_cookies={}, @delete_cookies={}, @host="localhost", @secure=false, @closed=false, @cookies={"_myapp_session"=>"BAh7Ck==--776b2fcfcd63d3c84d2b1de5327e277499add6d4", "fbsr_1505068851081"=>"mqZeyvoRC"}, @signed=#<ActionDispatch::Cookies::SignedCookieJar:0x007 @parent_jar=#<ActionDispatch::Cookies::CookieJar:0x007fdf...>, @verifier=#<ActiveSupport::MessageVerifier:0x007fdfa34548d8 @secret="f4d518c0b2e9d8", @digest="SHA1", @serializer=Marshal>>>

要用javascript设置cookie,可以执行以下操作:

document.cookie="something= test";

因此,您可以添加一个事件(点击、提交…(来从输入中获取值,并按照我上面提到的方式创建cookie。

在rails中,您可以读取这样的值:

cookies["something"]

如果需要,您还可以用javascript指定cookie何时过期。

简短回答

  1. 安装MDN JavaScript Cookie框架

  2. 在你的js文件上:

    docCookies.setItem('my_cookie', 'my_cookie_value', '', '/');
    
  3. 在您的轨道控制器上:

    cookies[:my_cookie]
    

答案不那么简短

Rails ActionDispatch::Cookies默认将cookie路径设置为应用程序的,而纯JavaScript则默认为当前路径

这意味着,如果你不声明路径,你最终会得到两个不同的cookie,它们的名称相同,令人头疼。

为了解决此问题,您可以使用Chrome DevTools窗口上的"应用程序/cookie",这样您就可以看到每个cookie的所有详细信息,并在通过"控制台"面板修改它们时重新加载它们的值。

这可以解释您的问题。显然,你需要确保饼干的路径对齐。

如何读取jquery 设置的rails中的cookie