【问题标题】:Creating an account with a username使用用户名创建帐户
【发布时间】:2013-06-29 00:13:02
【问题描述】:

我已按照devise wiki 启用用户名登录与设计(而不是电子邮件)。但我不知道如何使用设计启用用户名注册/注册。

我已更改我的注册视图以提示输入姓名和密码。

app/views/devise/registrations/new.html.erb:

<h3>Sign up</h3>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div><%= f.label :firstname, "First Name", :autofocus => true %><br />
  <script type="text/javascript">window.onload = function() {document.getElementById('user_firstname').focus();}</script>
  <%= f.text_field :firstname %></div>

  <div><%= f.label :lastname, "Last Name", :autofocus => true %><br />
  <%= f.text_field :lastname %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render :partial => "devise/shared/links" %>

我已经编辑了我的模型以根据名字和姓氏生成用户名:

app/models/user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:username]

  # Setup accessible (or protected) attributes for your model
  #attr_accessor :username
  validates_presence_of :firstname, :lastname, :unique => true 
  after_validation :createUsername
  attr_accessible :username, :password, :password_confirmation, :remember_me, :firstname, :lastname
  #attr_protected :password

  def createUsername
    # create username from first-last name
    firstnamePart=self.firstname[0,1].downcase
    lastnamePart=self.lastname[0,5].downcase
    username=lastnamePart + firstnamePart
    count=0
    while username.length != 7
      username=username + count.to_s
      count +=1
    end
    self.username=username
    #verify username uniqueness?
  end


  def self.find_first_by_auth_conditions(warden_conditions)
      conditions = warden_conditions.dup
      if login = conditions.delete(:login)
        where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
      else
        where(conditions).first
      end
    end
end

但是当我尝试注册时,我收到以下错误。文字将不得不做,因为我没有足够的“声誉”来发布图片:

Sign up
1 error prohibited this user from being saved:
Email can't be blank

因此,devise 在注册/注册阶段仍在寻找电子邮件。我假设我必须编辑设计的控制器,但没有在以下命令中安装

  1. rails g 设计:安装
  2. rails g 设计用户
  3. rails g devise:views

所以我的 Rails 应用程序可能正在使用默认设计控制器 (/usr/local/rvm/gems/ruby-2.0.0-p195/gems/devise-1.5.4/app/controllers/devise/registrations_controller.rb)但我没有在其中看到任何对“电子邮件”的引用。

如何在注册/注册期间更改设计以接受用户名?任何帮助将不胜感激。

【问题讨论】:

  • 我要检查的第一件事是确保email 列从users 表中消失。
  • 好的,电子邮件字段仍在用户表中,但我已将其删除。
  • 所以,从用户表中删除电子邮件列后,我在重新启动我的应用程序并尝试使用名字和姓氏注册新用户后收到此错误:pastebin.com/PWfBNxu0
  • 仅供参考:这是我删除电子邮件列的方法:pastebin.com/4dBAhRP3
  • 看起来不错。确保你也完成了rake db:test:prepare

标签: ruby-on-rails devise


【解决方案1】:

看起来您在登录系统中完全放弃了电子邮件。这与 Devise 文章有很大不同,它仍然具有 email 属性,但仅使用 uername 登录。

在解决问题之前,请三思而后行。这真的不是一个好习惯。

  1. 大多数依赖电子邮件的常见设计模块都无法工作,可确认,密码恢复,密码确认等。你真的想要吗?如果用户丢失密码并恢复怎么办?这个系统没办法!

  2. 您无法将应用中的任何重要通知告知用户,例如重大的 TOS 更改。

  3. 您正在系统中邀请垃圾邮件。

【讨论】:

  • 1. “你真的想要那个吗?”不,我想在创建用户之后解决这个问题。 2.和上面一样,我会在创建用户后弄清楚如何解决这个问题。 3. 是的,但过一段时间我将不再有新用户,并且会禁用注册过程。或者想点别的。
  • @olveram,如果你不想这样做,就不要这样做。要使此功能通过,将需要在 Devise 上进行大量黑客攻击,才能避免电子邮件案例。如果黑客攻击只对这个不需要的功能有好处,那就是浪费时间。
  • 我的问题是一些用户没有电子邮件地址,我希望他们能够轻松注册。
  • 看来我的手机无法将此答案标记为已接受我的问题,所以我回家后再做,谢谢
  • @olveram,我很高兴。如果他们没有电子邮件,即使 Facebook 和 Twitter 也无法让他们进入。谷歌可以,但有很多复杂的机制。为了更容易登录,您可以在将来应用第三方登录,其中电子邮件不是必须的身份验证令牌。
【解决方案2】:

您是否“将 config/initializers/devise.rb 修改为:”

config.authentication_keys = [ :username ]

【讨论】:

  • 是的,我忘了在原帖中添加:config.authentication_keys = [:username]
  • 要去约会,今晚晚些时候回来。感谢所有的帮助,我很感激。