Как предотвратить удаление записи Rails 6 - PullRequest
0 голосов
/ 31 марта 2020

Я ожидал бы, что следующий код будет работать, но определение класса 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

Результаты теста модели rspe c в

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 >

Я чувствую, что что-то упустил очень просто c но я не могу это заметить, и нет, это не тот случай, когда я удаляю оператор end из объявления класса Error

Я совершенно ошеломлен этим и приветствую альтернативные предложения как сделать это надежно

1 Ответ

1 голос
/ 31 марта 2020

Я думаю, это определение класса внутри:

Class Error < StandardError
end

Должно быть

class Error < StandardError
end

Надеюсь, это поможет.

...