Posted at

Rails で view から controller のファイルパスを得る方法

Rails 5.0.1 にて

"app/controllers/#{controller.class.name.underscore}.rb"


仕組み

view では controller というメソッドで controller のインスタンスが取れる。

ので、それの class 名をとって ( .class.name )、ファイル名(拡張子なし)にするために underscore してみる。これにディレクトリと拡張子を追加することで、通常の命名規則でやっている限りは解決できる。


本当に String#underscore でいいのか

AbsctractController::Base#controller_path にて、下記のように 「"Controller" を消す && underscore にする」で実装されているので、これと同じようにやれば問題ないはず

    def controller_path

@controller_path ||= name.sub(/Controller$/, ''.freeze).underscore unless anonymous?
end

https://github.com/rails/rails/blob/v5.0.1/actionpack/lib/abstract_controller/base.rb#L96-L98


イマイチな点



  • app/controllers/ を決め打ちで書かなくてはいけない


  • .rb を決め打ちで書かなくてはいけない

今のところ解消方法が見つかっていないです。