新手问题 Ruby on Rails 教程 第 8 章

bmiwdmb · 2015年02月12日 · 最后由 bmiwdmb 回复于 2015年02月13日 · 1877 次阅读

link

第八章中

def log_in(user) session[:user_id] = user.id end

利用這個輔助方法 session

接著會在首頁中調用

def current_user @current_user ||= User.find_by(id: session[:user_id]) end

教學中是這樣寫:

这样定义应该可以,不过如果页面中多次调用 current_user,就会多次查询数据库。所以,我们要使用一种 Ruby 习惯写法,把 User.find_by 的结果存储在实例变量中,只在第一次调用时查询数据库,后续再调用直接返回实例变量中存储的值:[5]

不過我發現每次瀏覽首頁的時候 (首頁有調用 current_user) 還是會去查詢數據庫。(rails server log)。

确定是首页调用 current_user 造成查询的,我将首页的 current_user 注解掉,导轨服务器日志就没有查询资料库的记录了

我的理解是@current_user应该会存东西,不过我把他手看跌 @current_user.to_s 发现他没存。所以每次到首页的时候还是会浏览查一次数据库。

请各位前辈解惑感谢。

匿名 #1 2015年02月12日

关于 current_user 你的理解是正确的,没错。 不过,你有点断章取义,或者作者 assume 你有一定的 ruby 基础。 解释如下: 教程,“只在第一次调用时查询数据库,后续再调用直接返回实例变量中存储的值”,中的“只在第一次”指的是每一次 request。 简单的说,如果你一次 request 中有 3 处 current_user 的调用,那么就会读取数据库 3 次,所以你应该把 current_user 保存在实例变量@user中,这样剩下的两次对 current_user 的调用就可以转变为对@user的调用,这样就不会再读取数据库中的内容。另外你需要搞清楚实例变量在 Rails 中的作用域。

每次访问是独立的,所以要查一次;这样处理之后,在页面内多次调用也只查一次。

#1 楼 @fuan 我了解了,豁然開朗,感謝前輩<(_ _)> Ruby 經驗確實有點少,大多是其它語言的,所以經前輩這樣一點可以理解是作用域的問題!

#2 楼 @night_7th #3 楼 @Rei

也感謝兩位前輩解惑<(_ _)>

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