0

ユーザーが登録する前に、まず API を介してユーザーを認証し、ユーザーの情報が有効かどうかを確認する必要があります。とにかく、必要に応じてvalidate_apiメソッドを機能させていますが、これをテストしましたが、障害のあるAPIに登録しようとすると、ユーザーが保存される理由がわかりません。

メソッドをコントローラーに配置し、有効な API で呼び出すと true が返され、次に欠陥のある API で false が返されました。

したがって、メソッドが機能している場合は、無視されているか、何かがオーバーライドされています。

私のユーザーモデル

class User < ActiveRecord::Base
  attr_accessor :login

    before_save :validate_api

    # Include default devise modules. Others available are:
    # :token_authenticatable, :confirmable,
    # :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login]

    validates :username, :presence => true, :length => { :minimum => 6, :maximum => 255 }
    validates :apiid, :presence => true, :numericality => { :only_integer => true }
    validates :vcode, :presence => true, :length => { :minimum => 20, :maximum => 255 }

    # Setup accessible (or protected) attributes for your model
    attr_accessible :login, :username, :group, :apiid, :vcode, :email, :password, :password_confirmation, :remember_me

    # Check if user is banned before login
    def active_for_authentication?
      super && self.banned == 0
    end

    # Redefine authentication procedure to allow login with username or email
    def self.find_for_database_authentication(warden_conditions)
      conditions = warden_conditions.dup
      if login = conditions.delete(:login).downcase
        #where(conditions).where('$or' => [ {:username => /^#{Regexp.escape(login)}$/i}, {:email => /^#{Regexp.escape(login)}$/i} ]).first
        where(conditions).where("username = '#{login}' OR email = '#{login}'").first
      else
        where(conditions).first
      end
    end

    # Validate API information
    private
    def validate_api

        require 'nokogiri'
        require 'open-uri'

        uri = "https://*******?keyID=#{self.apiid}&vCode=#{self.vcode}"
        xml = Nokogiri::XML(open(uri))

        xml.xpath("//row").each do |row|
            if row['****'].downcase == '****'
                return true
            else
                return false                
            end
        end
    end

end
4

1 に答える 1

1

before_save :validate_apiを使用する代わりに、を使用し、APIチェックが失敗した場合にvalidate :check_apiエラーメッセージ(例:)を追加する必要があります。errors[:apiid] << "must be a valid API id."

于 2013-03-15T16:27:27.180 に答える