1

password と password_confirmation を空白にすることはできないため、ユーザー モデルを保存できません。これは、次の場合に発生します。

  • edit_user_registration でユーザーを更新し、パスワードとパスワードの確認を空白のままにします。ここで初めて気づきました
  • コンソールで、オブジェクトをロードして save を呼び出した直後。

password_required? の場合、Devise はパスワードの存在を検証します。

  validates_presence_of     :password, :if => :password_required?

  def password_required?
    !persisted? || !password.nil? || !password_confirmation.nil?
  end

これは私のレールコンソール出力です:

  Loading development environment (Rails 3.2.11)
  1.9.3p374 :001 > u = User.last
    User Load (1.0ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1
   => #<User id: 9, name: "Name", email: "name@example.com", encrypted_password: "$2a$10$oCL2K0nEa8LxaMGuC1oyNOuwIHk8l/IOW.AylGcWTYj3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 2, current_sign_in_at: "2013-02-06 20:56:14", last_sign_in_at: "2013-02-06 20:52:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: "2013-02-07 22:04:01", confirmation_sent_at: "2013-02-07 22:03:25", unconfirmed_email: nil, authentication_token: nil, created_at: "2013-02-06 20:52:00", updated_at: "2013-02-07 22:04:31"> 
  1.9.3p374 :002 > u.save
     (0.2ms)  BEGIN
     (0.2ms)  ROLLBACK
   => false 
  1.9.3p374 :003 > u.errors
   => #<ActiveModel::Errors:0x007f832c04f090 @base=#<User id: 9, name: "Name", email: "name@example.com", encrypted_password: "$2a$10$oCL2K0nEa8LxaMGuC1oyNOuwIHk8l/IOW.AylGcWTYj3...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 2, current_sign_in_at: "2013-02-06 20:56:14", last_sign_in_at: "2013-02-06 20:52:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: "2013-02-07 22:04:01", confirmation_sent_at: "2013-02-07 22:03:25", unconfirmed_email: nil, authentication_token: nil, created_at: "2013-02-06 20:52:00", updated_at: "2013-02-07 22:04:31">, @messages={:password=>["can't be blank"], :password_confirmation=>["can't be blank"]}> 
  1.9.3p374 :004 > !u.persisted? || !u.password.nil? || !u.password_confirmation.nil?
   => false

ご協力いただきありがとうございます!

4

3 に答える 3

4

@rainkinz のおかげで、基本 (ユーザー モデル) に戻り、詳しく調べてみました。インポートしていたモジュールが余分なものを追加していることがわかりました

validates :email, :password, :password_confirmation, presence: true

コンソールで実行することでこれを見ることができました:

User.validators

 ...
 #<ActiveModel::Validations::PresenceValidator:0x007fb80fbcd260
   @attributes=[:email, :password, :password_confirmation],
   @options={}>,
 ...

これは、devise が入れるバリデーションとは異なります。

@options={:if=>:password_required?}>,

それらを削除すると問題が解決しました。ご協力いただきありがとうございます!

于 2013-02-08T15:31:49.877 に答える
2

update メソッドでこれを行います。

user = User.find_by_id(params[:id])
    unless user.blank?
      if user.update_attributes(params[:user])
        flash[:notice] = "User updated successfully."
        redirect_to "somwhere"
      else
        render :action => 'edit'
      end
    else
      render :action => 'edit'
    end

古いパスワードを更新したくない場合は、更新の前にこれらの行を追加して、新しいコードが次のようになるようにします。

    user = User.find_by_id(params[:id])
        unless user.blank?
          params[:user].delete(:password) if params[:user][:password].blank?
          params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?
if user.update_attributes(params[:user])
            flash[:notice] = "User updated successfully."
            redirect_to "somwhere"
          else
            render :action => 'edit'
          end
        else
          render :action => 'edit'
        end

user.rb モデルに次のように記述します

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :locakable
于 2013-02-08T05:10:59.323 に答える