controller_name
コントローラの名前を含む文字列を返すことについて知っていますが、ヘルパー内からコントローラクラス(またはオブジェクト)を取得するにはどうすればよいですか?
編集:このソリューションは、コントローラーに名前空間が設定されている場合にも機能するはずです(例Admin::PostsController
) 。
controller_name
コントローラの名前を含む文字列を返すことについて知っていますが、ヘルパー内からコントローラクラス(またはオブジェクト)を取得するにはどうすればよいですか?
編集:このソリューションは、コントローラーに名前空間が設定されている場合にも機能するはずです(例Admin::PostsController
) 。
constantize
次のような方法を使用できます。
controller_name.constantize
名前空間付きのコントローラーがある場合、どのように動作するかはわかりませんが。
アップデート:
これは、すべてのコントローラー名や名前空間で機能するわけではありません。#controller
と組み合わせてメソッドを使用することができますが#class
:
controller.class
純粋なRubyでは、クラス名は定数であるため、これを実行して文字列からクラスを取得できます。
classname = 'Posts'
p Kernel.const_get(classname).methods
constantize
Railsには、これだけの便利なショートカットがあります。
p 'Posts'.constantize.methods
クラス名が「editable_file」などの場合、最初にcamelize
メソッドを呼び出します。
p 'editable_file'.camelize.constantize # EditableFile
p 'extensions/editable_file'.camelize.constantize # Extensions::EditableFile
編集:本当にコントローラー名をデコードせずに取得したい場合は、このコードでconfig/initializers/controller_name.rb
それを確認する必要があります:
class ActionController::Metal
def self.controller_name
# @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore
@controller_name ||= self.name.sub(/Controller$/, '').underscore
end
end
ビューはおそらくこれを行う必要はありません。理想的には、これを期待するビューで実行しようとしていることは何でも、代わりにコントローラーで実行します。
なぜこれを実行したいのかを考えてみると、私が考えることができる最善の答えは、コントローラーで定義したヘルパーメソッドを呼び出したいということです。これを行うための構造がすでに存在します。helper_methodを使用してください。
他のほとんどの場合、コントローラーはそのデータをビューに提供する必要があります。コントローラからそれを引き出すビューではありません。(たとえば、クラスは必要ないはずですが、コントローラーはクラスにを提供することができます。これにより@controller_class = self.class
、ビューで使用できるようになります)