新手问题 Rails 一个赋值的问题

2forVendetta · 2013年05月14日 · 最后由 zj0713001 回复于 2013年05月14日 · 4034 次阅读

当用户登录的时候会 我需要生成一个随机密钥存到数据库和 cookie 里

cookies.permanent[:remember_token] = SecureRandom.urlsafe_base64
user.update_attributes(remember_token: cookies.permanent[:remember_token])

这是一开始的代码 会出现一个undefined method '[]' for nil:NilClass 错误 找了半天也没看到问题于是修改了一下代码

user.update_attributes(remember_token: SecureRandom.urlsafe_base64)
cookies.permanent[:remember_token] = user.remember_token

就没有问题了

但是两段代码从语义上来说没有区别 不懂怎么会提示 [] 为方法的错误... 然后把cookies.permanent[:remember_token] 编程"#{cookies.permanent[:remember_token]}"还是提示同样的错误

楼主把 cookies.inspectcookies.permanent.inspect 打印出来看看?

#1 楼 @iBachue 下面这是打印出来的内容

cookies.inspect:
#<ActionDispatch::Cookies::CookieJar:0x007fb7a421a8c8 @secret="180c55c6cb9f2840156bdbf337b97ec1d3d2f8bb56dd3ca144a2f1630fb932d907bf930ddf677c296b32f613cc121f0e4efeaaaef154d760aa1312bd77509f0b", @set_cookies={}, @delete_cookies={}, @host="0.0.0.0", @secure=false, @closed=false, @cookies={"_baiwale_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTNhMjRmMzNhODZlNWI5MTBkNTk3NWEyZDhlZDg3ODcxBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMU9wTmZNUUlRbnVodkc0dGl0aDU3dkd5QUc5RHQwSDdjZXpHZTBIL1dNSlE9BjsARg==--c3e3059d6a5a0a51e0dd8bbd67e887cf7b6acd8b", "remember_token"=>"GQEip8f8XlryHzNu0T986Q"}, @signed=#<ActionDispatch::Cookies::SignedCookieJar:0x007fb7a423baf0 @parent_jar=#<ActionDispatch::Cookies::CookieJar:0x007fb7a421a8c8 ...>, @verifier=#<ActiveSupport::MessageVerifier:0x007fb7a423be10 @secret="180c55c6cb9f2840156bdbf337b97ec1d3d2f8bb56dd3ca144a2f1630fb932d907bf930ddf677c296b32f613cc121f0e4efeaaaef154d760aa1312bd77509f0b", @digest="SHA1", @serializer=Marshal>>>

------------------------------
cookies.permanent.inspect:
#<ActionDispatch::Cookies::PermanentCookieJar:0x007fb7a61b26b8 @parent_jar=#<ActionDispatch::Cookies::CookieJar:0x007fb7a421a8c8 @secret="180c55c6cb9f2840156bdbf337b97ec1d3d2f8bb56dd3ca144a2f1630fb932d907bf930ddf677c296b32f613cc121f0e4efeaaaef154d760aa1312bd77509f0b", @set_cookies={}, @delete_cookies={}, @host="0.0.0.0", @secure=false, @closed=false, @cookies={"_baiwale_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTNhMjRmMzNhODZlNWI5MTBkNTk3NWEyZDhlZDg3ODcxBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMU9wTmZNUUlRbnVodkc0dGl0aDU3dkd5QUc5RHQwSDdjZXpHZTBIL1dNSlE9BjsARg==--c3e3059d6a5a0a51e0dd8bbd67e887cf7b6acd8b", "remember_token"=>"GQEip8f8XlryHzNu0T986Q"}, @signed=#<ActionDispatch::Cookies::SignedCookieJar:0x007fb7a423baf0 @parent_jar=#<ActionDispatch::Cookies::CookieJar:0x007fb7a421a8c8 ...>, @verifier=#<ActiveSupport::MessageVerifier:0x007fb7a423be10 @secret="180c55c6cb9f2840156bdbf337b97ec1d3d2f8bb56dd3ca144a2f1630fb932d907bf930ddf677c296b32f613cc121f0e4efeaaaef154d760aa1312bd77509f0b", @digest="SHA1", @serializer=Marshal>>, @permanent=#<ActionDispatch::Cookies::PermanentCookieJar:0x007fb7a61b26b8 ...>>, @secret="180c55c6cb9f2840156bdbf337b97ec1d3d2f8bb56dd3ca144a2f1630fb932d907bf930ddf677c296b32f613cc121f0e4efeaaaef154d760aa1312bd77509f0b"> 

#2 楼 @2forVendetta 看上去没什么问题嘛 看到 Nil 错误不是在 permanent 上,楼主还是把 backtrace 打出来看看?

#3 楼 @iBachue backtrace??? 什么这是 刚接触不太懂

你看到截图中下面一行行的那种就是 backtrace 了

难道 cookies.permanent 有定义[]=方法,但没有定义[]方法么

#6 楼 @aptx4869 楼主明显是 Nil 错误 不是 method not found

app/helpers/session_helper.rb的第 7 行是神马内容?

楼主还是试试看把第 7 行的cookies.permanent[:remember_token]换成cookies[:remember_token]

#6 楼 @aptx4869 我也不知道啊 奔泪

我现在推测是死这@cookies里面了

#11 楼 @iBachuecookies[:remember_token]就可以了 非常感谢啊 我觉得@aptx4869 说的有道理 有可能cookies.permanent[:remember_token]= 方法把:remember_token 持久化 但是变量还是存在 cookies 里

#14 楼 @2forVendettacookies.permanent方法创建一个 PermanentCookieJar 对象,虽然后者继承自 CookieJar,继承了[]方法,但是[]里引用的是@cookies,这个对象在 PermanentCookieJar 没有被初始化过,所以出现了 nil 错误。如果希望修复的话,其实只要在 PermanentCookieJar 实现一个[]方法,里面引用@parent_jar就可以了

#15 楼 @iBachue 明白了 谢谢大神

#14 楼 @2forVendetta 逻辑上 cookies.permanent 也只能实现 setter,不太好实现 getter 吧…… 因为浏览器端本身没有真正永久的 cookies,cookies.permanent 应该只是将过期时间设置为当前时间加上一个比较大的值,反过来要 get 的时候就没法判断 permanent 什么的,到头来还是直接按 cookies[:key] 来读取,于是也没实现的必要

#17 楼 @aptx4869 不实现的话其实比较反直觉啊

#18 楼 @iBachue 我觉得 cookies.permanent 的存在本身就有点反直觉……其实我是第一次看见这种写法……然后就想,这 get 该怎么实现……嘛,其实 lz 可以实现了然后提个 pull request

#19 楼 @aptx4869 这种增加功能而不是 fix bug 的 pull request 没这么容易通过吧。

rails 太多反只觉得东西了

#21 楼 @2forVendetta 所以我有问题都是看源码的

#21 楼 @2forVendetta #22 楼 @iBachue 文档里也有写 cookies.permanent # Sets a "permanent" cookie (which expires in 20 years from now).

没有 [] 只有 []= 确实是挺坑

需要 登录 后方可回复, 如果你还没有账号请 注册新账号