我的密码验证有问题!当我将password和password_confirmation设置为特定值时,无论我做什么,都会打印错误“密码不能为空”。 这是我的迁移文件:
class CreateUsers < ActiveRecord::Migration[5.1]
def change
create_table :users do |t|
t.string :username
t.string :email
t.string :password_digest
t.string :first_name
t.string :last_name
t.integer :role_id, :default => 1
t.timestamps
t.boolean :newsletter_status
end
end
end
我的模特档案:
class User < ActiveRecord::Base
belongs_to :role
has_many :article
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
length: { minimum: 4 },
uniqueness: { case_sensitive: false },
format: { with: VALID_EMAIL_REGEX }
validates :first_name, presence: true,
length: { minimum: 3, maximum: 50 }
validates :last_name, presence: true,
length: { minimum: 3, maximum: 50 }
validates :username, presence: true,
length: { minimum: 3, maximum: 30 },
uniqueness: { case_sensitive: true }
validates :password, length: { minimum: 6, maximum: 100 }, allow_nil: true
has_secure_password
end
我的控制器文件:
class UsersController < ApplicationController
def new
@user = User.new
@user.role_id = 1
end
def create
@user = User.new(user_params)
@user.role_id = 1
if @user.save
flash[:notice] = "L'article à bien été créé"
redirect_to article_path(@article)
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :username, :email, :password, :password_confirmation, :role_id, :newsletter_status)
end
end
我的观点:
<div class="row">
<div class="col-md-6 mb-3">
<%= f.label :password, "Mot de passe" %>
<%= f.password_field :password, class: "form-control", placeholder: "Mot de passe" %>
</div>
<div class="col-md-6 mb-3">
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: "form-control", placeholder: "Mot de passe" %>
</div>
</div>
无论我做什么,它都无法创建用户。如果我在rails控制台user = User.new中输入并输入所有参数,则仍然可以在error.full_messages中写入密码不能为空:
2.3.4 :021 > user = User.create(first_name: 'Name', last_name: 'Surname', email: 'email@example.com', username: 'Username', password: 'password', password_confirmation: 'password', newsletter_status: true)
(0.1ms) begin transaction
Role Load (0.3ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) LIMIT ? [["email", "email@example.com"], ["LIMIT", 1]]
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE "users"."username" = ? LIMIT ? [["username", "Username"], ["LIMIT", 1]]
(0.1ms) rollback transaction
=> #<User id: nil, username: "Username", email: "email@example.com", password_digest: nil, first_name: "Name", last_name: "Surname", role_id: 1, created_at: nil, updated_at: nil, newsletter_status: true>
2.3.4 :022 > user.errors.full_messages
=> ["Password can't be blank"]
我在rails 5.1.4和ruby 2.3.3上 谢谢!
答案 0 :(得分:0)
尝试将has_secure_password
置于验证规则之上。
如果allow_nil: true
旨在让用户在不输入密码的情况下更新其他信息,请尝试使用allow_blank: true
。
最后,根据文档,bcrypt的最大长度为72,因此您可以删除验证的最大长度部分。 http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html
答案 1 :(得分:-2)
迁移文件存在问题。
您尚未为密码创建一行。