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: "午後"

参考

Tags of current page

,