gpt4 book ai didi

ruby-on-rails-3 - Rails 中关联的空对象模式

转载 作者:行者123 更新时间:2023-12-04 18:45:24 25 4
gpt4 key购买 nike

尽管在此处查看了有关 Rails 中空对象的一些答案,但我似乎无法让它们工作。

class User < ActiveRecord::Base
has_one :profile
accepts_nested_attributes_for :profile

def profile
self.profile || NullProfile #I have also tried
@profile || NullProfile #but it didn't work either
end
end

class NullProfile
def display #this method exists on the real Profile class
""
end
end

class UsersController < ApplicationController
def create
User.new(params)
end
end

我的问题是,在创建用户时,我为配置文件传入了正确的嵌套属性 (profile_attributes),最终在我的新用户上得到了一个 NullProfile。

我猜这意味着我的自定义配置文件方法在创建时被调用并返回一个 NullProfile。我如何正确执行此 NullObject 以便这仅在读取时发生,而不是在对象的初始创建时发生。

最佳答案

我正在经历,如果它不存在,我想要一个干净的新对象(如果你这样做只是为了 object.display 不会出错,也许 object.try(:display) 更好)这也是我发现的:

1:别名/alias_method_chain

def profile_with_no_nill
profile_without_no_nill || NullProfile
end
alias_method_chain :profile, :no_nill

但是由于 alias_method_chain 已被弃用,如果您处于边缘,则必须自己手动执行该模式... The answer here似乎提供了更好更优雅的解决方案

2(答案的简化/实用版本):
class User < ActiveRecord::Base
has_one :profile
accepts_nested_attributes_for :profile

module ProfileNullObject
def profile
super || NullProfile
end
end
include ProfileNullObject
end

注:你做这件事的顺序(在链接的答案中解释)

关于你尝试过的:

当你做
def profile
@profile || NullProfile
end

它不会像预期的那样运行,因为协会是延迟加载的(除非你在搜索中告诉它 :include),所以 @profile 为零,这就是为什么你总是得到 NullProfile
def profile
self.profile || NullProfile
end

它会失败,因为该方法正在调用自身,所以它就像一个递归方法,你得到 SystemStackError: stack level too deep

关于ruby-on-rails-3 - Rails 中关联的空对象模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121737/

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