2013-06-20 98 views
2

我正在使用设计来管理我的应用程序的用户帐户。到目前为止,一切工作都很顺利,但我偶然发现了我发现的非常奇怪的行为。基本上发生的事情是,我下面的代码添加到我的用户模型:密码验证中断设计确认

validates :password, { confirmation: true, length: { in: 6..20 } } 
validates :username, { uniqueness: true, length: { in: 3..25 } } 

乍一看这似乎很好地工作。未能输入有效信息会使用户信息不能保存到数据库中。不幸的是,它以某种方式破坏了设计的电子邮件确认。设计仍然在注册时发送电子邮件,但确认链接不像以前那样工作。突然间发生了什么事情,他发送我到页面,我可以重新请求确认信息(尽管没有被告知这样做)。他还抱怨(通过闪光消息)我的密码不能“空白”,并且用户未被保存。这是毫无意义的,因为在确认链接被点击之前用户已经被保存了(也有一个有效的密码)。而且它实际上得到保存,因为我发现手动检查数据库表。

我从这里收集到的是他可能试图更改用户表中的某些列,如confirmed_email和confirmed_at等。但不知何故,他也尝试在同一时间提供新的pw,这绝对不是他应该正在做。为什么他将我重定向到可以重新发送确认邮件的页面,这完全超出了我的想象。

我能做些什么来解决我的问题?我不想使用:validatable,而是做我自己的验证,而不会完全破坏我的设计。下面是一些额外的信息:

轨3.2.12
红宝石1.9.3p392 色器件2.2.3

日志:

入门使用 “/用户/确认confirmation_token = ojx35QawQdHSWi655mru?” 为127.0。 0.1在2013-06-20 17:01:12 +0200 处理由Devise :: ConfirmationsController#显示为HTML 参数:{“confirmation_token”=>“ojx35QawQdHSWi655mru”} 用户负载(0.3ms)SELECT“users”。 * FROM“users”WHERE“users”。“confirmation_token”='ojx35QawQdHSWi655mru'LIMIT 1 (0.1ms)BEGIN User Exists(0.2ms)SELECT 1 AS one FROM“users”WHERE(“users”。“username”='what heck'AND“users”。“id”!= 22)LIMIT 1 (2.1ms) (0.1ms)ROLLBACK 渲染设计/共享/ _links.erb(0.4ms) 布局/应用程序中渲染设计/确认/ new.html.erb(2.1ms) 已完成200在14ms内完成(Views:9.0ms | ActiveRecord的:为0.8ms)

回答

7

它可能不是你的问题,但设计已经验证你的密码

config/initializers/devise.rb

config.password_length = 8..128

尝试改变这不是增加它首先到用户模型。 (或将其删除)

+0

对我来说这条线是用相同的号码活跃,但我仍然可以使用2个报名符号长度密码。有人知道为什么 – Gediminas

+2

取消注释后,您是否重新启动服务器? – lilwupster

+0

是的。对我来说,它只在将验证规则添加到模型中时才有效... – Gediminas

0

编辑此线在devise.rb

config.password_length = 6..20 

这上面的行被内置在devise.The密码长度的结构被设置为8至128中orignal.The设计用户不需要编写关于用户认证的自定义验证器。对于例如,对于电子邮件格式,我们可以设置

config.email_regexp = /\A[^@][email protected][^@]+\z/ 
+1

单行答案很难接受。尝试编辑和解释*为什么*这个答案是正确的,以帮助OP学习。 – codeMagic

0

忘了条目application_controller.rb在轨道4,5

before_action :configure_permitted_parameters, if: :devise_controller? protected 
def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up {|u|u.permit(:email,:password,:password_confirmation)} 
end