gpt4 book ai didi

ruby-on-rails - 在Rails中实现NullObject模式

转载 作者:行者123 更新时间:2023-12-04 13:16:50 25 4
gpt4 key购买 nike

我是一个想要保留已删除用户帖子的Post belongs_to :user的应用程序。当查看作者被删除的帖子时,这可能导致 View 错误。我试图做到这一点:

class Post < ActiveRecord::Base
belongs_to :author, class_name: 'User', foreign_key: 'user_id'

def author
author || NullUser.new
super
end
end

这会导致“堆栈级别变深”错误。为什么?我可以这样做:
class Post < ActiveRecord::Base
belongs_to :user

def author
user || NullUser.new
end

def author=(user)
self.user = user
end
end

但是用这种方式搞乱我的协会似乎是不对的。最好的方法是什么?

最佳答案

为了回答您的问题,

1. def author
2. author || NullUser.new
3. super
4. end

在第1行中,您要定义 author方法。然后在第2行中,您再次调用该author方法!这一直在发生,并且您会得到堆栈级别太深的错误。正确的方法是
def author
super || NullUser.new
end

因此,您无需再在其内部调用author方法。您只是在调用父类(super class)或返回NullUser。如果在调用 super时出现nil错误,则添加一个附加的nil检查:
def author
(super || NullUser.new) rescue NullUser.new
end

救援语句将捕获所有错误,然后返回NullUser.new,因此您不必担心 super 抛出错误。

编辑:

处理 super 抛出异常的另一种方法看起来更好:
def author
(super rescue nil) || NullUser.new
end

关于ruby-on-rails - 在Rails中实现NullObject模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17127358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com