我遇到了一种情况,我试图在设计流程之外创建自己的用户,因为我需要在创建后立即修改用户模型。
以下是控制器的相关操作:
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