とりあえず、メールアドレスで認証するようにする。
今どき、ハンドル・ネームでのログインってのも、ねえ?
なんてことを、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。
スバラシイ:-)