とりあえず、メールアドレスで認証するようにする。

今どき、ハンドル・ネームでのログインってのも、ねえ?
なんてことを、bloggerにも書いてたな...

まあ、ヨシとするwww

で、Userモデルから、loginとnameを消して、nicknameを追加することにする。
で、マイグレーションファイルの作成。
まず、loginとnameの削除。

$ script/generate migration RemoveColumnLoginAndNameFromUser login:string name:string

で、編集。
*数字*_remove_column_login_and_name_from_user.rb

class RemoveColumnLoginAndNameFromUser < ActiveRecord::Migration
  def self.up
    remove_column :users, :login
    remove_column :users, :name
  end

  def self.down
    add_column :users, :name, :string, :limit => 40
    add_column :users, :login, :string, :limit => 100, :default => '', :null => true
  end
end

んで、nicknameの追加。

$ script/generate migration AddColumnNicknameToUser nickname:string

で、編集。
*数字*_add_column_nickname_to_user.rb

class AddColumnNicknameToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :nickname, :string, :limit => 100, :default => '', :null => true
  end

  def self.down
    remove_column :users, :nickname
  end
end

はい。これで、DBのスキーマ変更はイイでしょう。

後は、

  • user.loginへの呼び出しを、user.emailへ変更する(一部user.nickname)
  • なぜか('/')なんて形でルートへパスを指定しているところがあるんで、(root_path)-に書き換える
  • ルートパスを:controller => "sessions", :action => "new"に設定する。
  • public/index.htmlをindex.html.bakへリネームする。

って云う感じですか。

まあ、面倒だから、diff。
app/helpers/users_helper.rb

-    options.reverse_merge! :content_method => :login, :title_method => :login, :class => :nickname
+    options.reverse_merge! :content_method => :email, :title_method => :email, :class => :nickname

app/models/user.rb

-  validates_presence_of     :login
-  validates_length_of       :login,    :within => 3..40
-  validates_uniqueness_of   :login
-  validates_format_of       :login,    :with => Authentication.login_regex, :message => Authentication.bad_login_message
+  validates_presence_of     :nickname
+  validates_format_of       :nickname,     :with => Authentication.name_regex,  :message => Authentication.bad_name_message, :allow_nil => true
+  validates_length_of       :nickname,     :maximum => 100
 
-  validates_format_of       :name,     :with => Authentication.name_regex,  :message => Authentication.bad_name_message, :allow_nil => true
-  validates_length_of       :name,     :maximum => 100
(略)
-  attr_accessible :login, :email, :name, :password, :password_confirmation
+  attr_accessible :email, :nickname, :password, :password_confirmation
(略)
   def self.authenticate(login, password)
     return nil if login.blank? || password.blank?
-    u = find_in_state :first, :active, :conditions => {:login => login} # need to get the salt
+    u = find_in_state :first, :active, :conditions => {:email => login} # need to get the salt
     u && u.authenticated?(password) ? u : nil
   end
(略)
-  def login=(value)
-    write_attribute :login, (value ? value.downcase : nil)
-  end
-  

app/controllers/users_controller.rb

     if success && @user.errors.empty?
-      redirect_back_or_default('/')
+      redirect_back_or_default(root_path)
       flash[:notice] = "Thanks for signing up!  We're sending you an email with your activation code."
(略)
-      redirect_to '/login'
+      redirect_to(login_path)
(略)
-      redirect_back_or_default('/')
+      redirect_back_or_default(root_path)
(略)
-      redirect_back_or_default('/')
+      redirect_back_or_default(root_path)

app/controllers/sessions_controller.rb

-    user = User.authenticate(params[:login], params[:password])
+    user = User.authenticate(params[:email], params[:password])
(略)
-      redirect_back_or_default('/')
+      redirect_back_or_default(root_path)
(略)
-      @login       = params[:login]
+      @login       = params[:email]
(略)
-    redirect_back_or_default('/')
+    redirect_back_or_default(root_path)

app/views/users/new.html.erb

-<p><%= label_tag 'login' %><br/>
-<%= f.text_field :login %></p>
+<p><%= label_tag 'nickname' %><br/>
+<%= f.text_field :nickname %></p>

app/views/users/_user_bar.html.erb

-  <div id="user-bar-greeting">Logged in as <%= link_to_current_user :content_method => :login %></div>
+  <div id="user-bar-greeting">Logged in as <%= link_to_current_user :content_method => :nickname %></div>

app/views/sessions/new.html.erb

-<p><%= label_tag 'login' %><br />
-<%= text_field_tag 'login', @login %></p>
+<p><%= label_tag 'email' %><br />
+<%= text_field_tag 'email', @login %></p>

app/views/user_mailer/signup_notification.erb

-  Username: <%=h @user.login %>
+  Email: <%=h @user.email %>

app/views/user_mailer/activation.erb

-<%=h @user.login %>, your account has been activated.  Welcome aboard!
+<%=h @user.nickname %>, your account has been activated.  Welcome aboard!

config/routes.rb

+  map.root :controller => 'sessions', :action => 'new'

んで、public/index.htmlのリネーム

$ svn move ./public/index.html ./public/index.html.bak

で、マイグレートして動作確認。

$ rake db:migrate

おk。

スバラシイ:-)