我遇到了一种情况,我试图在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
答案 0 :(得分:0)
也许您需要在(我假设)resource
上定义一个返回HomeController
的{{1}}辅助方法。
@user
但鉴于这两个操作都在def resource
@user || User.new
end
helper_method :resource
而HomeController
确实返回resource.errors.empty?
,那么可能您在某处定义了一个true
方法,该方法会返回一个对象,不想要。