Rails 4 と Ruby 2.0 を使う (3)
Rails 4 と Ruby 2.0 を使う (2) の続き。
もう少し、devise を使っていろいろとやってみる。 目標としては User モデルと Admin モデルがあり、 利用者は User か Admin のどちらか一方だけに所属する。 User の方はメールを登録することで、アカウントを取得する。 Admin はあらかじめ最初のひとりを作成しておくことにする。
user に姓と名の項目を追加
db/migrate 以下にある *_devise_create_users.rb を編集して
t.string :first_name
t.string :last_name
を追加する。
git add db/migrate/20130318234323_devise_create_users.rb
git commit -m "Add first and last names to database"
データベースを作り直す。
rm db/development.sqlite3
rake db:migrate RAILS_ENV=development
git add db/schema.rb
git commit -m "Recreate db/schema.rb"
first_name と last_name は必須項目にするので、app/models/user.rb に
validates :first_name, :presence => true
validates :last_name, :presence => true
を加え、attr_accessible に :first_name と :last_name を追加する。
attr_accessible :email, :password, :password_confirmation, :remember_me, :first_name, :last_name
view でも first_name と last_name を表示するようにする。 app/views/users/registrations/new.html.haml に
%div
= f.label :last_name
%br/
= f.text_field :last_name
%div
= f.label :first_name
%br/
= f.text_field :first_name
を加えてフォームを作る。
admin user
devise で生成する
rails g devise Admin
git add .
git commit -m "rails g devise Admin"
rake db:migrate RAILS_ENV=development
git add db/schema.rb
git commit -m "Update db/schema.rb"
rails generate devise:views admins
git add .
git commit -m "rails g devise:views admins"
rake haml:convert_erbs
git add .
find app/views -name "*.erb" | xargs git rm
git commit -m "Convert erb to haml"
最初の管理者ユーザ admin を追加
はじめから存在している管理者ユーザ admin を追加する。 db/seeds.rb を使用する。
path = File.join(__dir__, "seeds.yml")
if File.exist?(path)
YAML.load(File.read(path)).each do |h|
Admin.create(h)
end
end
db/seeds.yml を次のようにした。
- email: admin@example.com
password: pass_admin
とりあえず git が seeds.yml を無視するように .gitignore に
# Ignore the source of "rake db:seed"
/db/seeds.yml
を追加する。
git add db/seeds.rb
git commit -m "Load db/seeds.yml and add database"
git add .gitignore
git commit -m "Ignore /db/seeds.yml"
実際に、seeds.yml が反映されるか確認する。
rake db:seed
としてから http://localhost:3000/admins/sign_in にアクセスする。 seeds.yml に記述したメールアドレスとパスワードでログインできれば OK。
Devise のコントローラのカスタマイズ
confirmation のコントローラをカスタマイズして、一般ユーザの登録があったときに あるメールアドレスにそれを知らせたい。
devise のユーザに対応するコントローラの作成
まず、routes.rb に
devise_for :users, :controllers => { :confirmations => "users/confirmations" }
のように指定し、app/controllers/users/confirmations_controller.rb を作る。
class Users::ConfirmationsController < Devise::ConfirmationsController
def show
super
# Some operations
end
end
のようなコントローラを作る。
メールの送信
管理者の特定のメールアドレスに、ユーザ登録が完了したときにメールを送信するようにする。
rails generate mailer admin_report registration
git add .
git commit -m "rails generate mailer admin_report registration"
とする。app/mailers/admin_report.rb は
class AdminReport < ActionMailer::Base
default from: "from@example.com"
# Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup:
#
# en.admin_report.registration.subject
#
def registration(user)
@user = user
mail to: "to@example.org"
end
end
のようにして送信元、送信先のメールアドレスを設定する。 user は登録が完了したユーザのデータでその内容をメールに記述する。 これは view の app/views/admin_report/registration.text.erb に文面として書く。
app/controllers/users/confirmations_controller.rb を修正して登録完了したときにメールを送るようにする。
class Users::ConfirmationsController < Devise::ConfirmationsController
def show
super
if resource.errors.empty? && user_signed_in?
AdminReport.registration(current_user).deliver
end
end
end
もろもろの設定
タイムゾーン
タイムゾーンを日本にする。
rake time:zones:all
から使いたいタイムゾーンを探しておく。
Tokyo にするには config/application.rb に
config.time_zone = 'Tokyo'
を追加する。
http://stackoverflow.com/questions/6118779/how-to-change-default-timezone-for-activerecord-in-rails3
default locale
config/application.rb で設定する。
config.i18n.default_locale = :ja
datetime_select
時刻ののデータを編集するフォームは
<div class="field"> <%= f.label :event_time %><br /> <%= f.time_select :event_time \%> </div>
のようになっているが、日付も変更したい場合は
<%= f.datetime_select :event_time %>
とする。ただ、こうすると日本語の設定が足りないせいでエラーが出る。 config/locales/ja.yml を作り、次のようにする。
ja:
date:
formats:
default: "%Y/%m/%d"
short: "%m/%d"
long: "%Y年%m月%d日(%a)"
day_names: ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
abbr_day_names: ["日", "月", "火", "水", "木", "金", "土"]
month_names: ["~", "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
abbr_month_names: ["~", "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
order: ["year", "month", "day"]
time:
formats:
default: "%Y/%m/%d %H:%M:%S"
short: "%y/%m/%d %H:%M"
long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
am: "午前"
pm: "午後"