1

controller_nameコントローラの名前を含む文字列を返すことについて知っていますが、ヘルパー内からコントローラクラス(またはオブジェクト)を取得するにはどうすればよいですか?

編集:このソリューションは、コントローラーに名前空間が設定されている場合にも機能するはずです(例Admin::PostsController) 。

4

3 に答える 3

3

constantize次のような方法を使用できます。

controller_name.constantize

名前空間付きのコントローラーがある場合、どのように動作するかはわかりませんが。

アップデート:

これは、すべてのコントローラー名や名前空間で機能するわけではありません。#controllerと組み合わせてメソッドを使用することができますが#class

controller.class
于 2011-12-15T08:57:43.780 に答える
1

純粋なRubyでは、クラス名は定数であるため、これを実行して文字列からクラスを取得できます。

classname = 'Posts'
p Kernel.const_get(classname).methods

constantizeRailsには、これだけの便利なショートカットがあります。

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
于 2011-12-15T10:06:28.580 に答える
1

ビューはおそらくこれを行う必要はありません。理想的には、これを期待するビューで実行しようとしていることは何でも、代わりにコントローラーで実行します。

なぜこれを実行したいのかを考えてみると、私が考えることができる最善の答えは、コントローラーで定義したヘルパーメソッドを呼び出したいということです。これを行うための構造がすでに存在します。helper_methodを使用してください。

他のほとんどの場合、コントローラーはそのデータをビューに提供する必要があります。コントローラからそれを引き出すビューではありません。(たとえば、クラスは必要ないはずですが、コントローラーはクラスにを提供することができます。これにより@controller_class = self.class、ビューで使用できるようになります)

于 2011-12-15T11:05:25.440 に答える