【问题标题】:Rails 4: Password Validation Error: "{:password=>["can't be blank"]}" even though form is filled outRails 4:密码验证错误:“{:password=>["can't be blank"]}" 即使填写了表格
【发布时间】:2013-07-19 07:22:03
【问题描述】:

我对 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"} 

看来passwordpassword_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 %>

【问题讨论】:

  • 我知道重复它会很无聊,但是 - 你不应该编写自己的身份验证。这是个复杂的事情,你会弄错的。
  • 我明白了。那我应该如何处理身份验证?我应该使用特定的 gem 或库吗?或者rails有内置功能吗?谢谢。
  • 我会推荐Devise,它已经成为事实上的标准,但你可以在这里浏览ruby-toolbox.com/search?q=authentication
  • 很酷,谢谢迈克尔,我一定会调查的。到目前为止,它看起来会为我节省大量时间!

标签: ruby-on-rails ruby validation activerecord virtual-attribute


【解决方案1】:

问题是你的空吸气剂:

def password
end

它总是返回nil

【讨论】:

    【解决方案2】:

    对上一个答案的2个小补充,顺便说一下应该可以解决您的问题。

    1) 如果您使用的是 Rails >3(我假设您正在查看控制器中的 user_params 方法),您不必指定所有这些密码字段和验证。 ActiveRecord 自动包含这个 ActiveModel 方法:

    has_secure_password
    

    更多详情请访问:http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password

    2) 如果未加密的密码/password_confirmation 显示在您的日志文件中,则您的应用程序不安全。将此添加到您的 config/application.rb :

    config.filter_parameters = [:password, :password_confirmation]
    

    如果您在 User 模型中使用 has_secure_password,则不需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2013-12-25
      相关资源
      最近更新 更多