0

作成直後にユーザーモデルを変更する必要があるため、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

4

1 に答える 1

0

おそらく、を返すresourceヘルパーメソッドを(私が推測する)に定義する必要があります。HomeController@user

def resource
  @user || User.new
end
helper_method :resource

しかし、これら2つのアクションが実行されHomeControllerresource.errors.empty?返されることを考えるとtrue、おそらく、resource不要なオブジェクトを返すメソッドがどこかに定義されています。

于 2012-12-21T03:04:05.397 に答える