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