Я получаю сообщение об ошибке ожидания всякий раз, когда нажимаю «Оплатить с помощью Payola-Payment Gem» (жемчуг, созданный для Stripe) в моем приложении Rails 4.2.1.

Используя Payola-Payments Gem для обработки платежей Stripe, необходимо установить фоновый рабочий процесс для вашей транзакции. После настройки Background Worker с помощью ActiveJob я получаю сообщение об ошибке, когда нажимаю «Оплатить».

Вот оно:

Примечание. Я использую среду Windows (Windows 8) и считаю, что здесь что-то не так. Предупреждение об ошибке отображается в моем представлении:

Похоже, это занимает слишком много времени. Обратитесь в службу поддержки и сообщите идентификатор транзакции: ook4dp

Вот сгенерированный код из консоли

Started POST "/payola/buy/job/excelwithcode-7d492bf330ab66b0eaa61ce2ce277e14" for 127.0.0.1 at 2016-04-25 20:50:26 +0100
Processing by Payola::TransactionsController#create as */*
  Parameters: {"stripeToken"=>"tok_184FksCc1zXXaitaOrD5ELaH", "stripeEmail"=>"[email protected]", "authenticity_token"=>"Uod7Ue4XHNcCvayA6G1shiiI43QKoBOrbImnwt0TGFHVlp11WdHaNTcPl/0UyYefcT6foowc30bFdtK0cJuXog==", "product_class"=>"job", "permalink"=>"excelwithcode-7d492bf330ab66b0eaa61ce2ce277e14"}
  Payola::Affiliate Load (1.0ms)  SELECT  "payola_affiliates".* FROM "payola_affiliates" WHERE (lower(code) = lower(NULL))  ORDER BY "payola_affiliates"."id" ASC LIMIT 1
  Job Load (1.0ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."permalink" = ? LIMIT 1  [["permalink", "excelwithcode-7d492bf330ab66b0eaa61ce2ce277e14"]]
  Payola::Coupon Load (1.0ms)  SELECT  "payola_coupons".* FROM "payola_coupons" WHERE (lower(code) = lower(NULL))  ORDER BY "payola_coupons"."id" ASC LIMIT 1
   (1.0ms)  begin transaction
  Payola::Sale Exists (0.0ms)  SELECT  1 AS one FROM "payola_sales" WHERE "payola_sales"."guid" IS NULL LIMIT 1
  CACHE (0.0ms)  SELECT  1 AS one FROM "payola_sales" WHERE "payola_sales"."guid" IS NULL LIMIT 1
  Payola::Sale Exists (1.0ms)  SELECT  1 AS one FROM "payola_sales" WHERE "payola_sales"."guid" = 'ook4dp' LIMIT 1
  SQL (1.0ms)  INSERT INTO "payola_sales" ("product_id", "product_type", "email", "stripe_token", "currency", "amount", "state", "guid", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["product_id", 1], ["product_type", "Job"], ["email", "[email protected]"], ["stripe_token", "tok_184FksCc1zXXaitaOrD5ELaH"], ["currency", "usd"], ["amount", 20000], ["state", "pending"], ["guid", "ook4dp"], ["created_at", "2016-04-25 19:50:26.639939"], ["updated_at", "2016-04-25 19:50:26.639939"]]
  SQL (0.0ms)  INSERT INTO "versions" ("event", "created_at", "item_id", "item_type") VALUES (?, ?, ?, ?)  [["event", "create"], ["created_at", "2016-04-25 19:50:26.639939"], ["item_id", 2], ["item_type", "Payola::Sale"]]
   (150.3ms)  commit transaction
[ActiveJob] Enqueued Payola::Worker::ActiveJob (Job ID: 72e9235d-e2f2-42d6-8ae4-0a74dd8bce5d) to DelayedJob(default) with arguments: "Payola::ProcessSale", "ook4dp"
[ActiveJob]    (0.0ms)  begin transaction
[ActiveJob]   SQL (1.0ms)  INSERT INTO "delayed_jobs" ("queue", "handler", "run_at", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["queue", "default"], ["handler", "--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper\njob_data:\n  job_class: Payola::Worker::ActiveJob\n  job_id: 72e9235d-e2f2-42d6-8ae4-0a74dd8bce5d\n  queue_name: default\n  arguments:\n  - Payola::ProcessSale\n  - ook4dp\n"], ["run_at", "2016-04-25 19:50:26.812282"], ["created_at", "2016-04-25 19:50:26.812282"], ["updated_at", "2016-04-25 19:50:26.812282"]]
[ActiveJob]    (87.0ms)  commit transaction
Completed 200 OK in 284ms (Views: 1.0ms | ActiveRecord: 244.3ms)


Started GET "/payola/status/ook4dp" for 127.0.0.1 at 2016-04-25 20:50:26 +0100
Processing by Payola::TransactionsController#status as */*
  Parameters: {"guid"=>"ook4dp"}
  Payola::Affiliate Load (1.0ms)  SELECT  "payola_affiliates".* FROM "payola_affiliates" WHERE (lower(code) = lower(NULL))  ORDER BY "payola_affiliates"."id" ASC LIMIT 1
  Payola::Sale Load (1.0ms)  SELECT  "payola_sales".* FROM "payola_sales" WHERE "payola_sales"."guid" = ? LIMIT 1  [["guid", "ook4dp"]]
Completed 200 OK in 8ms (Views: 1.0ms | ActiveRecord: 2.0ms)


Started GET "/payola/status/ook4dp" for 127.0.0.1 at 2016-04-25 20:50:28 +0100
Processing by Payola::TransactionsController#status as */*
  Parameters: {"guid"=>"ook4dp"}
  Payola::Affiliate Load (1.0ms)  SELECT  "payola_affiliates".* FROM "payola_affiliates" WHERE (lower(code) = lower(NULL))  ORDER BY "payola_affiliates"."id" ASC LIMIT 1
  Payola::Sale Load (1.0ms)  SELECT  "payola_sales".* FROM "payola_sales" WHERE "payola_sales"."guid" = ? LIMIT 1  [["guid", "ook4dp"]]
Completed 200 OK in 8ms (Views: 0.0ms | ActiveRecord: 2.0ms)

На вкладке "Сеть" в моем браузере я получаю следующее

{guid: "ook4dp", status: "pending", error: null}
error: null
guid: "ook4dp"
status: "pending"

config/application.rb

require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'active_job'
require 'active_record'
require 'action_controller'
require 'action_view'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module App
  class Application < Rails::Application
    config.i18n.enforce_available_locales = true

    config.action_controller.action_on_unpermitted_parameters = :raise
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de

    config.active_record.raise_in_transactional_callbacks = true

    config.active_job.queue_adapter = :delayed_job

  end
end

модель/job.rb

class Job < ActiveRecord::Base
  include Payola::Sellable

  validates :title,
            :category,
            :location,
            :description,
            :company_name,
            :website,
            :email,
            :to_apply,
            presence: true
  validates :title, length: { maximum: 75 }
  validates :description, length: { minimum: 300 }
  validates :to_apply, length: { maximum: 500 }

  validates_formatting_of :email, using: :email
  validates_formatting_of :website, using: :url

  before_validation :provide_name, :provide_permalink

  def self.paid_ad
    where.not('stripeEmail' => nil).where.not('payola_sale_guid' => nil).where('created_at > ?', 30.days.ago)
  end

  def paid?
    (!(self.stripeEmail == nil) && !(self.payola_sale_guid == nil))
  end

  def self.search(params)
    jobs = Job.where('name like ? or description like?', "%#{params[:search]}%', '%#{params[:search]}%" ) if params [:search]
    jobs
  end


  private

  def provide_name
    self.name = 'excelwithcode' if self.name == nil
  end

  def provide_permalink
    self.permalink = "#{ self.name } #{ SecureRandom.hex }".parameterize if self.permalink == nil
  end
end

Глядя на свой журнал разработки, я понимаю, что транзакция продолжает повторяться из-за того, что фоновый рабочий использует ActiveJob, который я установил, но главная проблема заключается в том, что транзакция никогда не завершается успешно, и мое оповещение об ошибке отвечает на мою нашивку Custom. Форма оплаты, как описано выше. Другими словами, как только вы нажмете «ОПЛАТИТЬ», он зависнет.

Я до сих пор не знаю, почему это произошло, и мне нужна ваша помощь. Спасибо за помощь заранее


person Afolabi Olaoluwa Akinwumi    schedule 26.04.2016    source источник


Ответы (1)


Я исправил эту проблему.

Проблема связана с фоновым рабочим внутри /config/application.rb

Прокомментируйте Background Worker внутри /config/application.rb и потребуйте других зависимостей, чтобы он стал следующим кодом:

require File.expand_path('../boot', __FILE__)

require 'rails/all'
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "sprockets/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module App
  class Application < Rails::Application
    config.i18n.enforce_available_locales = true

    config.action_controller.action_on_unpermitted_parameters = :raise
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de

    config.active_record.raise_in_transactional_callbacks = true

    #config.active_job.queue_adapter = :delayed_job

  end
end

Это исправит это.

person Afolabi Olaoluwa Akinwumi    schedule 04.05.2016
comment
А? Опубликованное вами решение выглядит почти так же, как вопрос. У меня есть config.active_job.queue_adapter = :delayed_job, но я все еще получаю эту ошибку. - person Preston Lee; 18.05.2016
comment
@PrestonLee Какую версию Rails и Ruby вы используете? - person Afolabi Olaoluwa Akinwumi; 18.05.2016
comment
Если вы используете старые версии Rails ниже 4.2, а также Ruby, обновите их. Затем прокомментируйте config.active_job.queue_adapter = :delayed_job и снова запустите процесс. Тем не менее, вы можете захотеть использовать другие фоновые рабочие процессы, такие как: Sidekiq (:sidekiq) и SuckerPunch (:sucker_punch). - person Afolabi Olaoluwa Akinwumi; 18.05.2016
comment
@PrestonLee, еще одна вещь, которую вы можете сделать, чтобы избавиться от ошибки: 1. Не комментируйте config.active_job.queue_adapter = :delayed_job. 2. Запустите задания в очереди, запустив bundle exec rake jobs:work из терминала. Думаю, это решит проблему. Я попробовал это, и это тоже сработало. - person Afolabi Olaoluwa Akinwumi; 20.05.2016
comment
Я пробовал оба и, к сожалению, не ближе. Это ruby ​​v2.3.1p112 и rails v4.2.6. Вместо этого я могу попробовать koudoku и посмотреть, будет ли это более плавно интегрироваться. :/ - person Preston Lee; 23.05.2016