0

我遇到了一种情况,我试图在设计流程之外创建自己的用户,因为我需要在创建后立即修改用户模型。

以下是控制器的相关操作:

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

我们的流程是这样的:

我们的主页上有一个带有支付按钮的文本框。用户输入他们的电子邮件,点击支付按钮,条纹框弹出,输入抄送信息,点击“购买”并被定向到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

但是鉴于这两个动作都在HomeController并且resource.errors.empty?确实返回true,那么您可能在resource某处定义了一个方法,该方法返回您可能不想要的对象。

于 2012-12-21T03:04:05.397 回答