每当我在我的 Rails 4.2.1 应用程序中使用 Payola-Payment Gem(A gem made for Stripe)点击 Pay 时,我都会得到一个 "Pending Error"

I get a "Pending Error" whenever I click on Pay using Payola-Payment Gem (A gem made for Stripe) in my Rails 4.2.1 application

使用 Payola-Payments Gem 处理 Stripe Payments,有必要为您的交易设置 Background Worker。使用ActiveJob设置Background Worker后,点击pay会报错

在这儿:

注意:我正在使用 Windows 环境 (Windows 8),我认为这里有问题。 在我的视图上呈现错误警报:

This seems to be taking too long. Please contact support and give them transaction ID: 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"=>"neededforpayments@mybusinesstest.com", "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", "neededforpayments@mybusinesstest.com"], ["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

model/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

查看我的开发日志,我了解到由于 Background Worker 使用我设置的 ActiveJob,事务不断重复,但主要问题是事务永远不会成功 并且如上所述,我的错误警报会在我的 Stripe 自定义付款表格上做出响应。也就是说,一旦你点了PAY,它就卡住了。

我仍然不知道为什么会这样,我需要你的帮助。感谢您提前提供帮助

我解决了这个问题。

问题出在/config/application.rb

里面的Background Worker

/config/application.rb里面注释Background Worker,并且需要其他依赖,这样就变成了下面的代码:

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

这将解决问题。