如果他输入的电子邮件在数据库中不存在,我想要注册一个新用户。我有一个自定义会话控制器,代码如下:
resource = warden.authenticate!(:scope => resource_name, :recall => :failure)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
如何指示Devise以“失败”方式注册用户?
答案 0 :(得分:0)
您可以关注email only sign up method with Devise。扩展此功能,您可以将故障方法发布到注册控制器,您已设置为仅处理电子邮件注册。
<强>更新强> 最简单的方法之一是覆盖响应,如here所示。除了你的情况,你可能想要这样的东西:
def respond
if http_auth?
http_auth
else
user = User.create(..user information) #Create the user (register them)
sign_in(user) # Sign in the user just created
redirect # Redirect to whatever page you want
end
end
这样您就可以拥有一个电子邮件字段,当用户未通过身份验证(用户不存在,密码错误等)时,将创建用户。当然,对于您的情况,您可能希望在其中嵌套另一个if
块以检查用户是否存在,因此您不会因为密码错误而尝试创建其他用户等。
希望这有帮助!
答案 1 :(得分:0)
我一直让那些尝试使用“注册”表单“登录”的用户。它与设计选择有很大关系,但我真的很喜欢捕捉所有的想法。
我只是找到了自己的解决方案。我不喜欢它,但它很简单(一旦我终于明白了)。我详细RegistrationsController
覆盖了app/controllers/registrations_controller.rb
。这是我在我网站主页上的注册表格有几个原因,所以在那里做这件事似乎很合适。
您需要创建# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
def new
super
end
def create
# This is where the magic happens. We actually check the validity of the
# username (an email in my case) and password manally.
email = params[:user][:email]
if user = User.find_by_email(email)
if user.valid_password?(params[:user][:password])
sign_in(user)
redirect_to '/'
return
end
end
# Default devise stuff
build_resource(sign_up_params)
resource_saved = resource.save
yield resource if block_given?
if resource_saved
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_flashing_format?
sign_up(resource_name, resource)
respond_with resource, location: after_sign_up_path_for(resource)
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
expire_data_after_sign_in!
respond_with resource, location: after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
@validatable = devise_mapping.validatable?
if @validatable
@minimum_password_length = resource_class.password_length.min
end
respond_with resource
end
end
def update
super
end
end
并将代码放在那里:
# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
您需要确保将您的路由配置为使用此控制器,详见我上面链接的其他SO帖子。
{{1}}祝你好运!