2

銀行口座情報とユーザー情報を取得する支払い API があります。私はAPI応答をキャッチし、ajaxを使用して情報をコントローラーに送信し、そこで情報をユーザーに保存しようとします。保存するとエラーが表示されますValidation failed: Password can't be blank, Password is invalid:何かアイデアはありますか?

銀行コントローラー:

def addbank
  @user = current_user
  @user.phone_number = params[:phone_number]
  @user.birth_year = params[:year]
  @user.bank_uri = (params['bank_acct_uri'])
  @user.save! # <------- ERROR here!
  # Code was removed to be more clear
end

ユーザーコントローラー:

def update
  # update user controller has been commented out but the error is still there
end

ユーザー モデル:

class User < ActiveRecord::Base
attr_accessible :email,:password,:password_confirmation,:phone_number,:birth_year

      attr_accessor :password
      before_save :encrypt_password
      before_save { |user| user.email = email.downcase }

      VALID_PASSWORD_REGEX = # some reg-expression
      VALID_PHONE = # some reg-expression
      validates_confirmation_of :password
      validates :password, presence: true, format:{  with: VALID_PASSWORD_REGEX }
      validates :phone_number, format: { with: VALID_PHONE }, if: :phone_number
end

編集:保存ユーザーが更新ユーザーコントローラーにヒットしないのはなぜですか?

4

4 に答える 4

2

1 つの特定のフィールド (あなたの場合はパスワード) の検証を避けたいが、他のすべての検証 (電話番号など) を行いたい場合は、次のようにすることができます。

attr_accessor :skip_password

validates :password, presence: true, format:{  with: VALID_PASSWORD_REGEX }, unless: :skip_password

次に、コントローラーで次のことができます。

def addbank
  @user = current_user
  @user.skip_password = true # We don't want to validate this..
  @user.phone_number = params[:phone_number]
  @user.birth_year = params[:year]
  @user.bank_uri = (params['bank_acct_uri'])
  @user.save! # <------- ERROR here!
  # Code was removed to be more clear
end

これは自己責任で行ってください~~

于 2013-11-11T16:59:47.893 に答える
1

検証なしで保存を試みることができます:

@user.save(:validate => false)

アップデート:

if !@user.valid? && @user.errors[:phone_number].any?
  #do not save
else
 @user.save(:validate => false)
end
于 2013-11-11T16:52:36.437 に答える
1

暗号化されたパスワードをどこに保存していますか?

に保存するとpassword、 と等しくないため、保存するたびに検証に失敗しpassword_confirmationます。

パスワードを別のフィールドに入れることをお勧めします。

#from the User Model
attr_accessor :password, :password_confirmation

validates_presence_of :password, :on => :create
validates_confirmation_of :password

def password=(password)
    @password = password
    self.password_digest = BCrypt::Password.create(@password, :cost => 14)
end

def authenticate(password)
    BCrypt::Password.new(self.password_digest) == password
end

このようにして、パスワードはハッシュされて password_digest に保存され、保存時に検証エラーが発生しなくなります。

于 2013-11-11T16:53:46.593 に答える
0

これが原因であると約95%確信しているので、これを投稿しますが、オフになっている場合は申し訳ありません.

これの原因は、ユーザーのパスワードが実際に空白であるためだと思います。データベースを見ると、おそらく という名前の列が表示されます。これは、モデルを介して直接アクセスされることはなく、アクセス可能な属性encrypted_passwordに復号化されることもありません。passwordpassword_confirmation

ユーザーを更新するには、パスワードを再入力するか、save(false)(潜在的に危険な) 検証をバイパスする方法を使用する必要があります。

于 2013-11-11T16:53:37.677 に答える