2008年7月16日水曜日

ruby on rails関連の覚書

Act as Authenticatedのインストール
$ ruby script/plugin discover
$ ruby script/plugin install acts_as_authenticated
$ ./script/generate authenticated user account
$ rake db:migrate
メール認証の設定
$ ./script/generate authenticated_mailer
userconfig/environment.rb を修正 (Rails 1.2 以上)

Rails::Initializer.run do |config|
config.active_record.observers = :user_observer
end


メール送信設定
config/environments/development.rbを修正

 ActionMailer::Base.delivery_method = :sendmail

メールのサブジェクト、送信者を設定
app/models/user_notifier.rbの各メソッドの以下の値を設定
@subject
@body[:url]
@from

Activatioin機能

DBスキーマ変更

activation_code, activated_at というフィールドが必要になるので、DBにカラムを追加する
migrate/適当な数字_alter_user.rb を作成

class
AlterUsers <>
def self.up
add_column :users, :activation_code, :string, :limit => 40
add_column :users, :activated_at, :datetime
end
def self.down
remove_column :users, :activation_code
remove_column :users, :activated_at
end
end

migrate を実行
$ rake db:migrate


User モデルの変更
app/models/user.rb
class User <> before_create :make_activation_code
# loginと非暗号のパスワードから認証し、userかnilを返す
def self.authenticate(login, password)
# activated_at が NULL以外
u = find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login] u && u.authenticated?(password) ? u : nil
end
# ユーザーを有効化する
def activate @activated = true update_attributes(:activated_at => Time.now.utc, :activation_code => nil)
end
# 有効化されてたら true 返す
def recently_activated? @activated
end

protected
# 有効化コードを生成する

def make_activation_code
self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
end
end

accountコントローラを修正
app/controllers/account_controller.rb

class AccountController <> :
def signup @user = User.new(params[:user]) return unless request.post? @user.save!
# self.current_user = @user
# activate するまえにログインしちゃいや

# redirect_back_or_default(:controller => '/account', :action => 'index')
redirect_to(:action => 'signup_notification') flash[:notice] = "Thanks for signing up!"
rescue
ActiveRecord::RecordInvalid render :action => 'signup'
end

def
signup_notification
end

# 有効化
def activate
@user = User.find_by_activation_code(params[:id])
if
@user and @user.activate self.current_user = @user
# redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = "Your account has been activated."
end
end
end

メールの本文のテンプレートを変更
app/views/user_notifier/signup_notification.rhtml
アカウントが作成されました。 ユーザー名: <%= @user.login %> パスワード: <%= @user.password %> アカウントを有効化する為に以下のURLにアクセスしてください。 <%= @url %>

app/views/user_notifier/activation.rhtml
<%= @user.login %>さん ユーザー登録が完了しました。 <%= @url %>