我想创建一个具有这种行为的组合对象:
page = MinimalistCms::Page.create
page.test #return undefined method
page.parts.create!(title: 'test', body: 'test')
page.test #return 'test'
page.test = 'a body'
page.test #return 'a body'
为此,我创建了这个类:
module PartComposition
def self.included(model_class)
model_class.class_eval do
has_many :parts, class_name: 'PagePart'
end
end
def method_missing(name, *args)
title = name.to_s.downcase.underscore
if title.end_with?('=')
return update_part(title, args.first)
else
part = find_part(title)
if part
return part.body
else
super(name, *args)
end
end
end
private
def update_part(title, attribute)
part = find_part(title.chop)
return part.update_attribute(:body, attribute)
end
def find_part(title)
parts.with_globalize(title: title).first
end
end
它可以工作,但是当我这样做时,page.body = 'test'
它会自动保存记录。我不确定这是最好的方法。
第一次, page.test 应该返回未定义的方法。创建一个零件应该创建一个新的虚拟属性。该属性应该与普通属性完全一样。
你有想法吗?