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

ruby-on-rails-3 – Rails中关联的空对象模式,第1张

概述尽管在这里看到一些关于轨道中的Null对象的答案,我似乎无法让它们工作. class User < ActiveRecord::Base has_one :profile accepts_nested_attributes_for :profile def profile self.profile || NullProfile #I have also tried @ 尽管在这里看到一些关于轨道中的Null对象的答案,我似乎无法让它们工作.

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中关联的空对象模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存