この種の動作で構成されたオブジェクトを作成したい:
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 は未定義のメソッドを返す必要があります。パーツを作成するには、新しい仮想属性を作成する必要があります。この属性は、通常の属性とまったく同じように機能する必要があります。
アイデアはありますか?