【发布时间】:2017-11-29 21:31:20
【问题描述】:
我的密码验证有问题!当我将密码和密码确认设置为特定值时,无论我做什么都会打印错误“密码不能为空”。 这是我的迁移文件:
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 并输入所有参数,它仍然会在 errors.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 谢谢!
【问题讨论】:
-
rails 控制台中
user = User.create(first_name: 'Name', last_name: 'Surname', email: 'email@example.com', username: 'Username', password: 'password', password_confirmation: 'password')的输出是什么? -
它这样做:pastebin.com/WBmnpKeQ |我会将其添加到问题@tbard
-
看起来password=方法没有被调用或覆盖。这个方法负责填充password_digest,在rails验证时发现它是空的。尝试评论您的密码验证,即 validates :password .. 。 has_secure_password 确实在其上添加了验证。
-
@NarenSisodiya 我评论了 has_secure_password 并验证 :password 行。但是,问题并没有消失:当我发出命令
User.create(first_name: 'Name', last_name: 'Surname', email: 'email@example.com', username: 'Username', password: 'password', password_confirmation: 'password', newsletter_status: true)我仍然有相同的错误。full_messages -
您是否有任何正在进行验证的回调(before_create 或 before_save)。你的用户模型有 password_digest 属性吗?
标签: ruby-on-rails