module HasUrl
extend ActiveSupport::Concern
included do
attr_accessor :bar
end
def bar
0
end
end
class Foo < ActiveRecord::Base
include HasUrl
end
bar 属性はデータベースに保存されませんが、フォームで使用されます (SimpleForm の を使用f.input
)。bar
このメソッドのゲッターをオーバーライドして、他の属性に基づいて設定し、フォームに値を適切に事前入力できるようにしたいと思います。
問題は、このようなインクルード ブロックで使用すると、クラスattr_accessor
にゲッターがセットアップされることです。Foo
モジュールはFoo
祖先チェーンの上位に含まれているため、 bar
0 を返すカスタム メソッドには触れられません。
これを解決する1つの方法は、
class Foo < ActiveRecord::Base
include HasUrl
def bar
super
end
end
しかし、私はこの余分なステップを避けたいと思っています。モジュールを含めて、それを「機能」させたいだけです。もう 1 つのオプションは、フォーム (f.input_field など) で別のヘルパーを使用することですが、SimpleForm のラッパーを利用することはできません。
Module#prepend も私の問題を解決しませんHasUrl
。他のもの (特に ActiveRecord コールバック) も定義しているためです。先頭に追加すると、これらのコールバックでエラーが発生します。
NoMethodError: undefined method `_run_...__find__...__callbacks`
prepend が機能するように、このエラーを回避する方法はありますか? または、これを完全に行う別の方法はありますか?