ruby-on-rails - 如何防止记录被删除 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
我希望这有帮助。
推荐阅读
- javascript - 一步减少和排序对象数组
- amazon-web-services - Kinesis 和 SQS 有什么区别?
- ruby - Ruby条件不在reduce方法内部触发
- excel - 使用 VBA 复制列并粘贴为值时出错
- javascript - 如何使用 JQuery 根据文本值将不同的属性分配给同一类的多个元素
- firebase - Firebase / Cloud Firestore / 规则设置(读取、写入、更新、删除)
- go - 如何在 Golang GRPC 中为持久流(又名 pubsub)创建服务器
- ios - 由于蓝牙通知字符串不正确,Apple 不断拒绝使用 AdMob 的应用程序
- ios - 如何在 FirebaseUI 中打开自定义电话身份验证视图控制器?
- python - 如何生成一定长度的带前缀的信用卡号?