私が見つけた setter= 構文の例はすべて非常に単純です。
def name=(value)
@name = value
end
この構文でもっと複雑なことはできますか? 特に、対応するインスタンス変数を持たずに使用できますか? プライベートでもいい?何らかの検証を行うことはできますか?
リソースとしてルーティングされるモデルに基本的な CRUD 機能を提供するために拡張できる Rails コントローラーを作成しています。class_attribute を使用して、制御するモデルの名前を設定し、モデルの名前に基づいてインスタンス変数を作成します。次のようになります。
class ResourceController
class_attribute :model_class_name
def new
resource = self.model_class_name.new
end
protected
def self.init_resource(options={})
self.model_class_name = options[:model_class_name]
end
private
def resource
instance_variable_get(resource_instance_var)
end
def resource=(value)
instance_variable_set(resource_instance_var ,value)
end
def resource_instance_var
"@#{self.resource_class.name.underscore}".to_sym
end
end
上記のコード構造NoMethodError
では、View に Nil インスタンス変数があるため、View で を取得します。I を使用するlogger.debug
と、 までスタックをトレースできますが、呼び出されてresource = ...
いresource=
ません。
砂糖を落として使うと、set_resource(value)
すべてうまくいきます。私は setter= 構文からあまりにも多くを求めていますか、それとも私が見逃している他の問題がありますか?