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 endendclass NullProfile def display #this method exists on the real Profile class "" endendclass UsersController < ApplicationController def create User.new(params) endend
我的问题是在用户创建时,我为配置文件传递了适当的嵌套属性(profile_attributes),最后我的新用户使用了NullProfile.
我猜这意味着我的自定义配置文件方法在创建时被调用并返回NullProfile.我如何正确地执行此NullObject,以便这仅在读取时发生,而不是在对象的初始创建时发生.
解决方法 我完全通过了,我想要一个干净的新对象,如果它不存在(如果你这样做就是这样object.display不错,也许object.try(:display)更好)这也是我找到了什么:1:alias / alias_method_chain
def profile_with_no_nill profile_without_no_nill || NullProfileendalias_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 ProfileNullObjectend
注意:您执行此 *** 作的顺序(在链接的答案中解释)
你试过的:
当你做到了
def profile @profile || NullProfileend
它不会像预期的那样表现,因为协会被懒惰地加载(除非你告诉它:在搜索中包含它),所以@profile是nil,这就是为什么你总是得到NullProfile
def profile self.profile || NullProfileend
它会失败,因为该方法正在调用自身,所以它就像一个递归方法,你得到SystemStackerror:堆栈级别太深
总结以上是内存溢出为你收集整理的ruby-on-rails-3 – Rails中关联的空对象模式全部内容,希望文章能够帮你解决ruby-on-rails-3 – Rails中关联的空对象模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)