0

我正在构建一个 Rails 应用程序,在其中的一部分中,我将付款信息保存到数据库中。我需要使这些付款不可删除。

我创建了一个before_destroy可以工作的函数..但我遇到了一个问题:

这是我的代码:

class StripePayment < ActiveRecord::Base
belongs_to :user
belongs_to :stripe_card

before_destroy :fail

private
def fail
    return false
end
end

当我创建付款并在删除时尝试我的代码时:

StripePayment.first.destroy返回 false 并回滚......这正是我想要的。

但是, StripePayment.first.delete传递和删除对象。

我知道删除和销毁之间的区别。但是,我希望能够防止该对象在数据库上被删除(在delete()destroy()调用上。

我试过before_delete了,rails给了我这个错误:

NoMethodError: undefined method `before_delete' for #<Class:0x007fc1abc37c50>
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-4.0.0/lib/active_record/dynamic_matchers.rb:22:in `method_missing'
from /Users/alybadawy/developing/repos/finish/finish/app/models/stripe_payment.rb:7:in `<class:StripePayment>'
from /Users/alybadawy/developing/repos/finish/finish/app/models/stripe_payment.rb:1:in `<top (required)>'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `load'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `block in load_file'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:615:in `new_constants_in'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:422:in `load_file'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:323:in `require_or_load'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:462:in `load_missing_constant'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:183:in `const_missing'
from (irb):1
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
from /Users/alybadawy/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

任何帮助将不胜感激。谢谢 :)

4

2 回答 2

2

最简单的方法是,定义自己的删除方法

class StripePayment < ActiveRecord::Base
  belongs_to :user
  belongs_to :stripe_card

  before_destroy :fail

  def delete
    false
  end

  private
  def fail
      return false
  end
end

如果你有条件,你想允许删除,你可以检查你的删除方法并调用super

于 2013-09-08T16:23:04.437 回答
1

那是因为 delete 是在 rails 中跳过回调的函数之一

查看此内容以获取有关该主题的更多信息http://edgeguides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks

于 2013-09-08T16:35:45.210 回答