作成直後にユーザーモデルを変更する必要があるため、Devise のフロー外で独自のユーザーを作成しようとしている状況に遭遇しました。
コントローラーからの関連アクションは次のとおりです。
class HomeController < ApplicationController
def resource
@user || User.new
end
helper_method :resource
def create_user
@user = User.new email: params[:email]
end
def create_password
@user = User.new email: params[:email], password: params[:password], password_confirmation: params[:password]
if @user.save
sign_in @user
customer = Stripe::Customer.create(description: @user.email, card: params[:stripeToken])
current_user.stripe_customer_id = customer.id
Stripe::Charge.create(amount: 5000, currency: "usd", customer: user.stripe_customer_id)
role = Role.find_by_name("purchased")
current_user.roles << role
current_user.save
redirect_to user_root_url, notice: "You signed up"
else
render action: "create_user"
end
end
end
フローは次のとおりです。
ホームページに支払いボタン付きのテキストボックスがあります。ユーザーが電子メールを入力し、支払いボタンをクリックすると、Stripe ボックスがポップアップし、CC 情報を入力し、[購入] をクリックすると、そのcreate_user
ページに移動します。これ:
.wrapper
%h1 Create Password
= form_tag create_password_home_url do
= devise_error_messages!
= label_tag :email
= text_field_tag :email, @user.email
%br
= label_tag :password
= password_field_tag :password
%br
= hidden_field_tag :stripeToken, params[:stripeToken]
= submit_tag "Create Password"
ユーザーにパスワードの入力を求めると、これでユーザー側からのアカウント作成が完了します (create_password
アクション内)。
保存に成功した場合@user
は問題なく動作しますが、そうでない場合は「パスワードを作成してください」フォームにリダイレクトされますが、デバイス エラーは発生しません。私のテスト ケースでは、システムに既に存在することがわかっている電子メールを使用しています。Devise を利用した別のサインアップ ページで、Devise はこのエラーについて適切に教えてくれます。
デバッグしようとすると、次のコードにたどり着きましたDeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
sentence = I18n.t("errors.messages.not_saved",
:count => resource.errors.count,
:resource => resource.class.model_name.human.downcase)
html = <<-HTML
<div id="error_explanation">
<h2>#{sentence}</h2>
<ul>#{messages}</ul>
</div>
HTML
html.html_safe
end
の値を確認するresource.errors.empty?
と、実際にはtrue
.
エラーがリソースに追加されていない理由は何ですか?
レール 3.2.1
ルビー1.9.2
編集
ヘルパー関数:
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
resource
として報告されていますUser