在Devise中执行“登录或注册”

时间:2012-12-27 19:03:30

标签: ruby-on-rails ruby devise

如果他输入的电子邮件在数据库中不存在,我想要注册一个新用户。我有一个自定义会话控制器,代码如下:

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以“失败”方式注册用户?

2 个答案:

答案 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}}
祝你好运!