首先谢谢你们做了这样一个系统, 给我们提供了一个好的学习样本。不过今天又发现个 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, 不知道要修改些什么, 如果你们能指点一下, 不胜感激。
如果有高手想做, 那就再好不过了。