使用has_secure_password进行密码确认

时间:2014-06-09 13:38:15

标签: ruby-on-rails ruby-on-rails-4 activemodel

我在has_secure_password模型中使用了行User。它看起来像这样:

class User < ActiveRecord::Base
    before_create :create_remember_token
  validates :name, presence: true, length: {minimum: 3, maximum: 22},
                            uniqueness: true
  #validates :password, presence: true, length: {minimum: 6, maximum: 22}
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+\.[a-z]+\z/i
    validates :email, :allow_blank => true, format: { with: VALID_EMAIL_REGEX }
  has_secure_password
  validates :password, length: {minimum: 6}

在我的User新视图中,我有这个:

<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>

      <%= f.label :name, 'Username' %>
      <%= f.text_field :name %>

      <%= f.label :email, 'Email (Optional)' %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
    <% end %>
  </div>
</div>

根据我的阅读,has_secure_password位应该“自动”创建并验证密码确认内容。但是,当我创建具有不匹配passwordpassword_confirmation的用户时,它不会抛出任何内容。

我出错的任何想法?

EDIT: forgot this       params.require(:user).permit(:name, :email, :password,
       line right here----->                       :password_confirmation)

1 个答案:

答案 0 :(得分:1)

根据您的问题,我不确定是否创建的用户没有匹配密码及其确认,或者是否仅显示错误消息。所以我会尝试回答这两个问题。

表单不会抛出有关错误的信息,因为您没有要查看的错误代码。在表单的开头添加这段代码,以在表单中显示flash错误。

<%= form_for @user do |f| %>
  <% if @user.errors.any? %>
    <div class="error_messages">
      <h2>Form is invalid</h2>
      <ul>
        <% for message in @user.errors.full_messages %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
....

其他可能是错误的是:

    has_secure_password
    validates :password, length: {minimum: 6}

您验证密码的最小长度,但不验证密码的存在。尝试更改第二行:         验证:密码,存在:真,长度:{最小值:6}

如果不起作用,请确保访问模型(rails 3)或controller(rails 4)中的password和password_confirmation字段:

如果您使用rails 3,则应在模型中添加代码,以便访问您在表单中不允许的所有参数:

app/models/user.rb
attr_accessible :name, :email, :password, :password_confirmation

如果你使用rails 4,它应该是这样的:

app/controllers/users_controller.rb
def user_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation)
end

希望它会有所帮助。