(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Rails で Helper Method を Controller で使いたい

って思ったんだけど、これが少し事情が複雑で単純に Helper を Controller に include するのはあまりよろしくないらしく出来れば AbstractController で定義されている helper を使う方が良いらしい。

helper (AbstractController::Helpers::ClassMethods) - APIdock

でも、逆に考えたら Controller で定義しているメソッドを View で使えればいいだけのような気がするので helper_method というメソッドを使っても良さそう。

helper_method (AbstractController::Helpers::ClassMethods) - APIdock

じゃあ、使えばいいじゃんって言うとそう単純な話でもなくて、 concerns の中に作った Module のメソッドを View で使いたかったというのが元々の発端だったので、 Module は当然ながら AbstractController を継承していないから helper_method も使えない。けど、そこは Ruby ということで included というメソッドをフックすることによってこの無理難題を解決出来る。

Using helper_method from a Mixin Module - Ruby Forum

module MyMixin
 def self.included(c)
   c.helper_method :my_helper
 end

 def my_helper
   etc.
 end
end

メタプログラミング Ruby あたりにもこの辺のテクニック書いてあったけど、すっかり忘れてました。便利。