Homeland omniauth 一个 ruby 小问题

Peter · 2012年07月09日 · 最后由 Peter 回复于 2012年07月09日 · 2230 次阅读

最近看 Ruby-China 的源码的时候,在 omniauth 部分我有些 ruby 方面的问题。

我想改动一下,把从 Facebook 登录过来的用户加入数据库,为了避免用户登录名重名,就把 email 当作 login, 并把@和那个点用下划线代替,代码如下:

def new_from_provider_data(provider, uid, data)
  ...
  user.email = data["email"]
  user.login = data["email"]
  user.login.gsub!(/[@]/, "_")
  ...

结果最后一句把 user.email 也改了,我是 ruby 新手,难道 user.email 和 user.login 都是指向 data["email"] 的吗,我改一个,另一个也就改了?

谢谢各位帮忙。

是的 user.login = data["email"].gsub(/[^\w]/, "_") 应该就可以了

user.login 是用来支持用户名 邮箱同时登陆的 默认 devise 是使用 user.email 登陆的你这个而且 你要使用user.login 需要你相关配置过后在 template 里面引用login这个虚拟属性 user.login 才有意义 但是 不会出现什么一个改了 另一个就改了 data["email"]来自于用户端 如果你都使用login这个虚拟属性 data["email"]是应该不会出现的 这里只是做一个 数据获取和预处理

因为你的代码中,user.email 和 user.login 指向的是同一个字符串,又用 gsub! 方法进行修改。可以改成:

user.email = data["email"]
user.login = user.email.gsub(/[@\.]/, "_")

想起感叹号的作用了,基础没打牢,谢谢大家

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