こんにちは。beaglesoftの真鍋です。
deviseでテストユーザーを作成するときなどユーザーを認証済み状態にして確認メールを送信したくないときが結構あったりします。特に大量のユーザーアカウントを作成してテストをシたい時とかですね。
そんな時にどうするかということを少し調べましが、以下のAPIを利用すると実現できました。
user.skip_confirmation!
# 追記:こちらはメール送信は行わないが認証済み状態とならない
user.skip_confirmation_notification!
追記
ちょっと間違えていました。skip_confirmation_notification
はメールの送信は行わないというだけで認証済み状態とはなりませんでした。
利用環境
今回の利用環境は以下のとおりとなります。
$ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] $ bundle list | grep devise * devise (4.2.0) * devise-bootstrap-views (0.0.10) * devise_invitable (1.7.0)
FactoryGirlを利用してみる
これがどのように便利かというとFactoryGirlを利用してテストデータを作成するときなどはとても便利です。なにせ、メールの送信を行う場合にはメールアドレスが存在する必要があることもあり、いろいろと手間です。
次のようにuserを生成します。ポイントはコールバックを利用してユーザーの作成前に上記のAPIを実行していることです。
# spec/factories/users.rb FactoryGirl.define do factory :user do sequence(:email) {|n| "test+#{Time.now.to_f}@beaglesoft.net"} password 'aaaaaaA@' password_confirmation 'aaaaaaA@' association :contractant before(:create){ |user| # ここで認証済みでメールを送信しない設定を行う user.skip_confirmation_notification! user.skip_confirmation! } end end
実行するとこのような感じになります。
>> u = FactoryGirl.create(:user) (0.2ms) BEGIN SQL (0.3ms) INSERT INTO "service_plans" ("service_plan_name", "service_start_date", "service_end_date", "lock_version", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["service_plan_name", "basic"], ["service_start_date", "2016-12-25"], ["service_end_date", "2016-12-25"], ["lock_version", 1], ["created_at", "2016-12-31 21:53:54.742763"], ["updated_at", "2016-12-31 21:53:54.742763"]] (1.1ms) COMMIT (0.2ms) BEGIN SQL (0.4ms) INSERT INTO "contracts" ("service_plan_id", "trial_term_expired_date", "user_status", "payment_customer_id", "lock_version", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["service_plan_id", 105], ["trial_term_expired_date", "2016-12-25"], ["user_status", 1], ["payment_customer_id", "MyString"], ["lock_version", 1], ["created_at", "2016-12-31 21:53:54.748693"], ["updated_at", "2016-12-31 21:53:54.748693"]] (1.0ms) COMMIT (0.2ms) BEGIN SQL (0.4ms) INSERT INTO "contractants" ("contractant_name", "contractant_name_kana", "contract_id", "person_in_charge_name", "phone_number", "fax_number", "pref_code", "city_name", "town_name", "street_name", "building_name", "billing_no", "email", "contract_start_date", "lock_version", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) RETURNING "id" [["contractant_name", "テスト契約者"], ["contractant_name_kana", "テストケイヤクシャ"], ["contract_id", 102], ["person_in_charge_name", "田島 仁希"], ["phone_number", "090-9125-2709"], ["fax_number", "070-8496-5025"], ["pref_code", "30"], ["city_name", "福島市"], ["town_name", "茗荷沢新田"], ["street_name", "1-1-1"], ["building_name", "テスト建物"], ["billing_no", "1111111-2222222-333333"], ["email", "adan@collinsbatz.net"], ["contract_start_date", "2016-11-30"], ["lock_version", 1], ["created_at", "2016-12-31 21:53:54.752141"], ["updated_at", "2016-12-31 21:53:54.752141"]] (1.0ms) COMMIT (0.2ms) BEGIN User Exists (0.6ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'test+1483188834.6317208@beaglesoft.net' LIMIT 1 SQL (0.4ms) INSERT INTO "users" ("email", "encrypted_password", "contractant_id", "confirmed_at", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["email", "test+1483188834.6317208@beaglesoft.net"], ["encrypted_password", "$2a$11$UR6vwsMzgO3BrgBVXDdxtuy2lsJvrE9LCfljKJh6HkmBdrtLkSeAa"], ["contractant_id", 102], ["confirmed_at", "2016-12-31 21:53:54.755272"], ["created_at", "2016-12-31 21:53:54.766156"], ["updated_at", "2016-12-31 21:53:54.766156"]] #<User id: 102, email: "test+1483188834.6317208@beaglesoft.net", created_at: "2016-12-31 12:53:54", updated_at: "2016-12-31 12:53:54", contractant_id: 102> (1.2ms) COMMIT >> u.confirmed? true
この通り確認メールを送信する必要がなくなるので、テストデータを作成するときにメールアドレスの存在を意識する必要がなくなります。