簡體   English   中英

如何防止記錄被刪除 Rails 6

[英]How to prevent a record from being deleted 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 語句的情況

我對此完全目瞪口呆,並歡迎有關如何可靠地做到這一點的其他建議

我認為是里面的類定義:

Class Error < StandardError
end

應該

class Error < StandardError
end

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM