新手问题 代码报错,什么原因

yuan_yp · 2013年08月16日 · 最后由 zj0713001 回复于 2013年08月16日 · 2576 次阅读
@userrole = Userrole.where('userID=?',@user.id)
        @userrole.each do|userrole|
          puts userrole.roleID
          @role = Role.where('id=?',userrole.roleID)[0]
          @cfunction = AuthCf.where('authID=?',@role.authorityID)
          @cfunction.each do|cfunction|
            puts cfunction.CFID
            @function = CFf.where('cFID=?',cfunction.CFID)
           @funciton.each do|function|
              @f = Function.where('id=?',function.fID)[0]
              @arr << @f.name
            end
          end
        end

@funciton.each do|function| 报错 undefined method ''each' for nil:NilClass

因为没有找到呀,还有 ror 里面的字段最好不要用大写。 ( @userrole||[]).each do|userrole| puts userrole.roleID @role = Role.where('id=?',userrole.roleID)[0] @cfunction = AuthCf.where('authID=?',@role.authorityID) (@cfunction || []).each do|cfunction| puts cfunction.CFID @function = CFf.where('cFID=?',cfunction.CFID) (@funciton || []).each do|function| @f = Function.where('id=?',function.fID)[0] @arr << @f.name end end end

你的查询语句没有查询出东西啊。返回是空值啊!

@function 为 nil,应该是数据库中没有 cFID cfunction.CFID 这条记录吧,这种最好判断@function 是否空,然后进行相应的操作,做一个基本的冗错处理。ps: 话说楼主你的命名好奇怪哦,建议看一下开源项目代码。

#2 楼 @Ryan #3 楼 @virgil #1 楼 @ice_bb 不要意思各位,好像是我的 function 单词拼错了

。。。我表示很无语,就算拼错了,你也要做处理的。自己慢慢搞吧!

#5 楼 @ice_bb 已经好了,谢谢你啊,有时候手打就是容易出问题

#6 楼 @yuan_yp 楼上的意思是说手打不手打不重要,重要的是你都有容错处理的机制,即使你没有打错,你也需要考虑下取值的语句是否会返回空值,否则还是会出现一样的错误。最好写一写测试来覆盖这种 edge cases

#7 楼 @nightire 哦,好的,谢谢指导

#5 楼 @ice_bb 妹纸 如果是用的 ActiveRecord 的话 where 的结果不可能是 nil 的 你的写法(@funciton || [])也太女汉子了 女神都是这么写的@funciton.to_a😄

@zj0713001 呵呵,恩是的,我只是想告诉他如果要是报错是 nil 的情况进行循环可以用那样的方法。哇哈哈。而且他现在是用的 where,如果要是用个 find_by_xxxx 呢

@zj0713001 不过我觉得女神的那个 to_a 一下很影响效率耶。如果要是是数组的话,那个数组也会再次的 to_a 一下哦!女神不是吃饱了没事干么!

一开始看得我一头雾水啊 @function.each do |function| 太难理解了 -_-|| @functions.each do |function| 才是约定吧?

@zj0713001 反正我觉得,就算它自己本身是数组的话,也要执行一下 to_a 进去判断一次,然后我觉得&&和||是短路原理,还是比较好点。

#14 楼 @ice_bb 我也觉得短路比较易读一点,一看就知道是在干什么。to_a 的话不知道的就会感觉有点怪「不是本来就是数组么为啥还要转一次呢?」

@zj0713001 原来女神和女汉子,就只是在一瞬间呀!

#14 楼 @ice_bb 很多地方都是要加 to_x 做强制转换的 比方之前的 yaml 漏洞就不会波及我们 因为我们所有的 params[:xx] 都写成了 params[:xx].to_s,然后参数如果是 array 就要强制做一次 to_a,因为你不知道参数过来的会是什么~ 短路也一样 我只是个人习惯觉得链式调用更 nice 一点...

当然你 你肯定是女神 不是女汉子的 哈哈哈哈哈哈哈

@zj0713001 如果要是数组的话,你干嘛不直接传数组的形式,要给 to_a 呢,不过有的地方确实是要进行转换!个人习惯问题。我跟女神无缘。哇哈哈。

@blacktulip 完全赞同你的想法!

#15 楼 @blacktulip #18 楼 @ice_bb 转一次的原因是 你没法 100% 确定传进来的是数组啊~

#20 楼 @zj0713001 params 我明白,楼主那个不是自己从数据库里面抓出来的嘛

另外想请教一下 params 转 to_s 在 rails 4 里头应该怎么写.. 还是就不用了?

#21 楼 @blacktulip 请教错人了外国银... 我还没正式写过 rails4 呢... 但是从 strong_parameters 的介绍里来看 the key :id will pass the whitelisting if it appears in params and it has a permitted scalar value associated. Otherwise the key is going to be filtered out, so arrays, hashes, or any other objects cannot be injected. The permitted scalar types are String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile and Rack::Test::UploadedFile.

也就是说 只是过滤了而已 想 to_s 应该还是没问题的... 比方说 Date to String~

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