Я бы порекомендовал поместить его в свой собственный модуль в каталог /lib
, а также обернуть вызов в Timeout
на случай, если веб-сайт, к которому вы пытаетесь получить доступ, недоступен. Я только что сделал общий пример ниже, чтобы вы могли настроить время по мере необходимости.
Внутри /lib/customer_status.rb
require 'timeout'
module CustomerStatus
class << self
def get_status
begin
Timeout::timeout(30) {
uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
status = http.request(request).body
} # end timeout
return status
rescue Exception => e
# This will catch a timeout error or any other network connectivity error
Rails.logger.error "We had an error getting the customer's status: #{e}"
end
end
end
end
Тогда вы можете просто назвать это так:
class UserSession < Authlogic::Session::Base
# include the new module we added
include CustomerStatus
before_create :check_status
private
def check status
raise someError unless (CustomerStatus.get_status.include?("active"))
end
end
Я позволю вам добавить другую логику для состояний cancelled
, pending
и т. Д., А также передать информацию о клиенте в новый метод модуля. Вы можете просто использовать оператор switch для обработки различных состояний.
Обновление
Кроме того, если у вас его еще нет в файле config/application.rb
, обязательно включите его, чтобы он добавил папку lib
в путь автозагрузки:
module YourAppNameGoesHere
class Application < Rails::Application
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
end
end