首页 > 解决方案 > 如何防止记录被删除 Rails 6

问题描述

我本来希望以下代码可以工作,但是根据测试结果,类 Error 的定义会导致过多的结束语句

class MenuItem < ApplicationRecord
  has_one :page, dependent: :destroy
  has_ancestry

  validates :menu_text, uniqueness: true, presence: true

  accepts_nested_attributes_for :page

  before_save :generate_url, :validate_home_page
  after_destroy :ensure_home_page_remains

  Class Error < StandardError
  end

  def to_param
    url # or "#{id}-#{name}".parameterize
  end

  #Home page is a special case and must always exist
  #To be called by migration on deploy but must not be editable.
  #Only the page content should be editable
  def self.create_home_page
    mi = self.find_by_url("home")
    if mi.blank?
      mi = self.new
      mi.menu_text = "Home"
      mi.url_editable = false
      pg = mi.build_page
      pg.content = "<h1>Home</h1>"
      mi.save
    end
  end

  protected

    def validate_home_page
      if changed?
        if menu_text.changed? && menu_text_was == "Home"
          errors.add(:menu_text, "Can't change home page menu text")
        end
      end
    end

    def ensure_home_page_remains
      if menu_text == "Home"
        raise Error.new "Can't delete home page"
      end
    end

    def generate_url
      self.url = menu_text.parameterize
    end

end

rspec 模型测试结果为

An error occurred while loading ./spec/models/menu_item_spec.rb.
Failure/Error:
  RSpec.describe MenuItem, type: :model do
    pending "add some examples to (or delete) #{__FILE__}"
  end

SyntaxError:
  /home/jamie/Development/rails/comtech/rawdoncc/app/models/menu_item.rb:54: syntax error, unexpected end, expecting end-of-input
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/zeitwerk-2.3.0/lib/zeitwerk/kernel.rb:16:in `require'
# ./spec/models/menu_item_spec.rb:3:in `<main>'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'
# /home/jamie/.rvm/gems/ruby-2.6.3@rawdon/gems/bootsnap-1.4.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:55:in `load'


Finished in 0.00003 seconds (files took 1 second to load)
0 examples, 0 failures, 1 error occurred outside of examples


[1] guard(main)> 

这是一个待定测试,尚未编写,但只是为了证明这不是测试代码问题,控制台输出会引发相同的错误

Loading development environment (Rails 6.0.2.2)
irb: warn: can't alias context from irb_context.
2.6.3 :001 > mi = MenuItem.new
Traceback (most recent call last):
        1: from (irb):1
SyntaxError (/home/jamie/Development/rails/comtech/rawdoncc/app/models/menu_item.rb:54: syntax error, unexpected end, expecting end-of-input)
2.6.3 :002 >

我觉得我一定遗漏了一些非常基本的东西,但我一生都无法发现它,不,这不是从 Error 类声明中删除 end 语句的情况

我对此完全目瞪口呆,并欢迎有关如何可靠地做到这一点的替代建议

标签: ruby-on-railsruby-on-rails-6

解决方案


我认为是里面的类定义:

Class Error < StandardError
end

应该

class Error < StandardError
end

我希望这有帮助。


推荐阅读