设计不显示用户创建错误

时间:2012-12-21 01:09:13

标签: ruby-on-rails devise gem

我遇到了一种情况,我试图在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 box pops向上,输入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

知道为什么没有将错误添加到资源中吗?

Rails 3.2.1

Ruby 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

1 个答案:

答案 0 :(得分:0)

也许您需要在(我假设)resource上定义一个返回HomeController的{​​{1}}辅助方法。

@user

但鉴于这两个操作都在def resource @user || User.new end helper_method :resource HomeController确实返回resource.errors.empty?,那么可能您在某处定义了一个true方法,该方法会返回一个对象,不想要。