我想使用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何时过期。
简短回答
-
安装MDN JavaScript Cookie框架
-
在你的js文件上:
docCookies.setItem('my_cookie', 'my_cookie_value', '', '/');
-
在您的轨道控制器上:
cookies[:my_cookie]
答案不那么简短
Rails ActionDispatch::Cookies默认将cookie路径设置为应用程序的根,而纯JavaScript则默认为当前路径。
这意味着,如果你不声明路径,你最终会得到两个不同的cookie,它们的名称相同,令人头疼。
为了解决此问题,您可以使用Chrome DevTools窗口上的"应用程序/cookie",这样您就可以看到每个cookie的所有详细信息,并在通过"控制台"面板修改它们时重新加载它们的值。
这可以解释您的问题。显然,你需要确保饼干的路径对齐。
如何读取jquery 设置的rails中的cookie