我对Rails相对较新(使用Rails 4),并且我的用户模型验证有问题。即使表单完全填入了两个密码,当我提交代码时,会打印出两个错误:
{:password=>["can't be blank"], :password_confirmation=>["doesn't match Password"]}
我希望将用户保存到数据库中,但这些验证错误阻止了这种情况的发生。我想知道的是我需要改变以消除这些错误。
我打印出params
对象,它看起来像这样(这里省略了真品标记):
params: {"utf8"=>"✓","authenticity_token"=>"[omitted]",
"user"=>{"username"=>"testuser1", "password"=>"test",
"password_confirmation"=>"test", "email_attributes"=>{"email"=>"d@d.com"},
"first_name"=>"test", "last_name"=>"user", "gender"=>"male", "city"=>"la",
"state"=>"ca", "country"=>"usa", "dob"=>"1980-11-20"},
"commit"=>"Create Account", "action"=>"create", "controller"=>"users"}
因此,password
和password_confirmation
属性似乎正确传递。我想知道这是否与我在用户模型中定义的虚拟属性password
有关,但如果是这种情况,我仍然不太确定如何解决这个问题。任何帮助将不胜感激。如果我需要进一步阐述,请告诉我。
以下是供参考的相关代码:
控制器:
class UsersController < ApplicationController
def new
@user = User.new
@user.build_email
end
def create
if @user = User.create(user_params)
logger.debug "#{@user.errors.messages}"
logger.debug "params: #{params}"
redirect_to :action => "new"
else
logger.debug "#{@user.errors.messages}"
logger.flush
redirect_to :action => "new"
end
end
private
def user_params
params.require(:user).permit(:username, :password, :password_confirmation, :first_name, :last_name, :gender, :dob, :city, :state, :country, :admin_level, email_attributes: [:email])
end
end
型号:
class User < ActiveRecord::Base
has_one :email
validates_presence_of :username, :email, :password
validates_confirmation_of :password, :on => :create
accepts_nested_attributes_for :email
def password_valid?(candidatePass)
candidatePassAndSalt = "#{candidatePass}#{self.salt}"
candidatePasswordDigest = Digest::SHA1.hexdigest(candidatePassAndSalt)
if (candidatePasswordDigest == self.password_digest)
return true
else
return false
end
end
def password
end
def password=(text)
self.salt = Random.new.rand
passAndSalt = "#{text}#{self.salt}"
self.password_digest = Digest::SHA1.hexdigest(passAndSalt)
end
end
查看:
<%= form_for @user, url: {action: "create"}, html: {class: "user-creation-form"} do |f| %>
<%= f.text_field :username %>username<br/>
<%= f.password_field :password %>pw<br/>
<%= f.password_field :password_confirmation %>pwcopy<br/>
<%= f.fields_for :email do |email_form| %>
<%= email_form.text_field :email %>email<br />
<% end %>
<%= f.text_field :first_name %>first<br/>
<%= f.text_field :last_name %>last<br/>
<%= f.radio_button :gender, "male" %>
<%= f.label :gender_male, "M" %>
<%= f.radio_button :gender, "female" %>
<%= f.label :gender_female, "F" %><br />
<%= f.text_field :city %>city<br/>
<%= f.text_field :state %>state<br/>
<%= f.text_field :country %>country<br/>
<%= f.date_field :dob %>dob<br/>
<%= f.submit "Create Account" %><br/>
<% end %>
答案 0 :(得分:1)
问题是你的空瘾者:
def password
end
它始终返回nil
。
答案 1 :(得分:0)
上一个答案的两个小补充,顺便说一句,这可以解决您的问题。
1)如果您使用的是Rails&gt; 3(我假设您是通过查看控制器中的user_params方法),则不必指定所有这些密码字段和验证。 ActiveRecord自动包含此ActiveModel方法:
has_secure_password
2)如果您的日志文件中显示未加密的密码/ password_confirmation,则您的应用程序不安全。将其添加到config / application.rb:
config.filter_parameters = [:password, :password_confirmation]
如果您在用户模型中使用has_secure_password
,则不需要这样做。