首先谢谢你们做了这样一个系统,给我们提供了一个好的学习样本。不过今天又发现个 bug, 或者说是上次报告的 bug 的衍生 bug
[Email 可以随便修改,用户可以随便自杀,不用提供密码](http://ruby-china.org/topics/4260),这些事弱爆了,用户自己头脑清醒点就没事了,出问题可以推给用户,因为他们自己没有登出,被改 Email 也怪不得谁。
我接受现实了,继续改用户系统,今天我想让用户从 Facebook 进来第一件事就是改掉系统给他们设置的随机用户名 (login) 和 密码。所以我在 user 表加了个字段,如果为 0 且用户不在修改用户名和密码的页面/account/edit,我就重定向 (redirect_to) 过来,代码写好了,测试: /topics /wiki /sites 都可以跳回 /account/edit
开心。
但点“会员” /users,出现 404, 好吧,自己技术不行,那就接受现实,到处 puts 吧,总会找到哪出的问题。
夜深了,我也挖得更深了,最后找到这个文件: .rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.6/lib/action_controller/metal/redirecting.rb
def redirect_to(options = {}, response_status = {}) #:doc:
raise ActionControllerError.new("Cannot redirect to nil!") unless options
raise AbstractController::DoubleRenderError if response_body
self.status = _extract_redirect_to_status(options, response_status)
self.location = _compute_redirect_to_location(options)
self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.h(location)}\">redirected</a>.</body></html>"
end
一顿 puts 之后,发现只有/users 链接 self.location 为 nil,我直接赋值也不行:
self.location = "http://localhost:3000/account/edit"
好吧,我想知道这个 location 是个什么东西,在.rvm/gems/ruby-1.9.3-p194/gems/
目录下 ack 一顿乱找,无果。中间修改了其他文件后有好些出错信息,copy+google 也无果。
因为修改 gemset 里面的文件要重启rails s
,时间就不知道浪费多少了,终于在今天,就在今天,突然想到在 app/controller/users_controller.rb
里面看看,之前只关注过 UsersController 的 before_filter, 没有搜索过 location,一搜发现,果然有戏
def location
@location = Location.find_by_name(params[:id])
if @location.blank?
render_404
return
end
...
end
原来 UsersController 自己有个 location 方法,redirect_to 函数里面想把一个链接字符串硬塞给 location,人家怎么可能要,人家又不傻,只有我傻了。
把这段注释掉,好了,可以跳转了,当然这只是发现问题,解决问题要做事还很多呢。这个 location 还导致了官方网站还有另一个 Bug,就是输入不在 location 表里的地名,比如“一个城市”,就会去 404。
============================================================ 所以请管理员们或各路高手指导一下吧,我觉得最好把 users 表里的 location 字段和这里的 location 方法最好改个名,比如"hometown", rails 里面不至于用这种词吧。
我想来修补这个 bug,不知道要修改些什么,如果你们能指点一下,不胜感激。
如果有高手想做,那就再好不过了。