Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,在事务完成后应用增量_Ruby On Rails - Fatal编程技术网

Ruby on rails 在Rails中,在事务完成后应用增量

Ruby on rails 在Rails中,在事务完成后应用增量,ruby-on-rails,Ruby On Rails,用户进行交易,可能带有优惠券代码,最后状态更改,购物车标记为已完成,邮件发送。我试图做的是更新使用的优惠券代码,并进行增量更改。目前,交易的订单模型具有以下内容: class TbCommerce::Order < ActiveRecord::Base self.table_name = 'tb_commerce_orders' scope :search, ->(term){ where('name LIKE ?', "%#{term}%") } belongs_to :c

用户进行交易,可能带有优惠券代码,最后状态更改,购物车标记为已完成,邮件发送。我试图做的是更新使用的优惠券代码,并进行增量更改。目前,交易的订单模型具有以下内容:

class TbCommerce::Order < ActiveRecord::Base
 self.table_name = 'tb_commerce_orders'
 scope :search, ->(term){ where('name LIKE ?', "%#{term}%") }

 belongs_to :cart, :inverse_of => :order, :foreign_key => :tb_commerce_cart_id
 has_many :transactions, :inverse_of => :order, :foreign_key => :tb_commerce_order_id
 has_one :captured_transaction, ->{ captured }, :class_name => 'TbCommerce::Transaction', :foreign_key => :tb_commerce_order_id

 validates_presence_of :cart, :name, :address, :city, :state, :postal, :country
 validates_uniqueness_of :cart
 validates_length_of :address, :maximum => 30
 validates :email, :format => {:with => Authlogic::Regex.email, :message => 'should look like an email address.'}
 before_create :set_invoice_number

 define_callbacks :capture
 set_callback :capture, :after, :after_capture

 def description
  return cart.description
end

module Status
OPEN = 'open'
PLACED = 'placed'
SHIPPED = 'shipped'
REFUNDED = 'refunded'
REMOVED = 'deleted'
end

def full_name
 return name
end

def full_address
 return "#{address}, #{city} #{state}, #{postal}, #{country}"
end

private

def set_invoice_number
  new_invoice_number = TbCommerce::Order.maximum(:invoice_number) || 1000000
loop do
  new_invoice_number += 1
  break unless TbCommerce::Order.exists?(:invoice_number => new_invoice_number)
end
self.invoice_number = new_invoice_number
end

def after_capture
  update_attribute(:status, Status::PLACED)
  cart.update_attribute(:is_completed, true)
  coupon.update(:used => used + 1)
  TbCommerce::OrderMailer.order_placed(self).deliver_later
  TbCommerce::OrderMailer.order_confirmation(self).deliver_later
  begin
    TbCommerce.after_capture.call(self)
  rescue e
    logger.error "Failed to run the after_capture hook with message: #{e}"
  end
   return true
  end

 end
<% @coupons.each do |coupon| %>
 <%= coupon.code %>
 <%= coupon.used %>
<% end %>
def increment_coupon_used!
 coupon.increment_used! if coupon.present?
return true

def increment_used!
 update(:used => used + 1)
end
使用的增值券!实际上是:

class TbCommerce::Order < ActiveRecord::Base
 self.table_name = 'tb_commerce_orders'
 scope :search, ->(term){ where('name LIKE ?', "%#{term}%") }

 belongs_to :cart, :inverse_of => :order, :foreign_key => :tb_commerce_cart_id
 has_many :transactions, :inverse_of => :order, :foreign_key => :tb_commerce_order_id
 has_one :captured_transaction, ->{ captured }, :class_name => 'TbCommerce::Transaction', :foreign_key => :tb_commerce_order_id

 validates_presence_of :cart, :name, :address, :city, :state, :postal, :country
 validates_uniqueness_of :cart
 validates_length_of :address, :maximum => 30
 validates :email, :format => {:with => Authlogic::Regex.email, :message => 'should look like an email address.'}
 before_create :set_invoice_number

 define_callbacks :capture
 set_callback :capture, :after, :after_capture

 def description
  return cart.description
end

module Status
OPEN = 'open'
PLACED = 'placed'
SHIPPED = 'shipped'
REFUNDED = 'refunded'
REMOVED = 'deleted'
end

def full_name
 return name
end

def full_address
 return "#{address}, #{city} #{state}, #{postal}, #{country}"
end

private

def set_invoice_number
  new_invoice_number = TbCommerce::Order.maximum(:invoice_number) || 1000000
loop do
  new_invoice_number += 1
  break unless TbCommerce::Order.exists?(:invoice_number => new_invoice_number)
end
self.invoice_number = new_invoice_number
end

def after_capture
  update_attribute(:status, Status::PLACED)
  cart.update_attribute(:is_completed, true)
  coupon.update(:used => used + 1)
  TbCommerce::OrderMailer.order_placed(self).deliver_later
  TbCommerce::OrderMailer.order_confirmation(self).deliver_later
  begin
    TbCommerce.after_capture.call(self)
  rescue e
    logger.error "Failed to run the after_capture hook with message: #{e}"
  end
   return true
  end

 end
<% @coupons.each do |coupon| %>
 <%= coupon.code %>
 <%= coupon.used %>
<% end %>
def increment_coupon_used!
 coupon.increment_used! if coupon.present?
return true

def increment_used!
 update(:used => used + 1)
end
最近更新:
看起来记录器有我得到的错误。NoMethodError:未定义的方法'increment!'在@coupon.increment!:使用过甚至是TbCommerce::优惠券。增量!:使用了

,因此出现了两个问题。首先是有一段感情,而我并没有正确地处理它。我最后做的是:

cart.increment_coupon_used!
Cart实际上包含了与订单具有关系的ValidateGroupon模型


存在的另一个问题是本地应用程序覆盖了这个gem。因此,在我将优惠券包含在购物车模型中之前,它永远不会起作用。

优惠券.update:used=>used+1是否返回true?我可能遗漏了一些内容,但如果要访问当前值:used,则必须将其保存在变量中,或者像updateused一样传递它:@tupoly.used+1。尝试@PatMellon@dbugger它确实返回true,然后它正在更新。所以要么你要么:a提供了错误的值;b在捕获后再次更新;或者c看着错误的优惠券对象。你怎么确定它没有增加?恭喜你弄明白了。