私はコントローラ名を含む文字列を返すことについて知っていますが、ヘルパー内からコントローラクラス(またはオブジェクト)を取得するにはどうすればよいですか?Rails 3のビュー/ヘルパー内からコントローラクラスを取得する方法は?
編集:私はどのようにわからないけど
controller_name.constantize
:コントローラは名前空間されたときにソリューションも(。例えばAdmin::PostsController
)動作するはず
私はコントローラ名を含む文字列を返すことについて知っていますが、ヘルパー内からコントローラクラス(またはオブジェクト)を取得するにはどうすればよいですか?Rails 3のビュー/ヘルパー内からコントローラクラスを取得する方法は?
編集:私はどのようにわからないけど
controller_name.constantize
:コントローラは名前空間されたときにソリューションも(。例えばAdmin::PostsController
)動作するはず
あなたは次のように、constantize
方法を使用することができます名前空間のコントローラを使用すると動作します。
更新:
1は、すべてのコントローラ名および/または名前空間のために動作しません。一つは#class
と組み合わせて#controller
メソッドを使用することができますが:
controller.class
、クラス名は定数であるので、あなたは文字列からクラスを取得するには、この操作を行うことができます。
classname = 'Posts'
p Kernel.const_get(classname).methods
ありRailsのでの素敵なショートカット、ちょうどこのためconstantize
:
p 'Posts'.constantize.methods
クラス名は、最初にを呼び出し、例えば「editable_file」である場合方法:
p 'editable_file'.camelize.constantize # EditableFile
p 'extensions/editable_file'.camelize.constantize # Extensions::EditableFile
はEDIT:あなたは本当に非demodulizedコントローラ名を取得したい場合は、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
を提供することができ、それはビューで利用可能になります)
私はあなたがなぜこれをする必要があるのだろうと思っています... –
ええ、あなたのヘルパーで 'controller_name'を使う必要があるかもしれません。たとえば、私は、user_nameというヘルパーが、controller_nameを使用して認証リンクをいつ印刷するかを決定します – maprihoda
'controller_name'は役に立ちません。なぜなら' Admin :: PostsController'は単に 'posts '。これをコンスタント化すると、コントローラを取得するには不十分な 'Posts'が返されます。 – Kostas
あなたは正しいです!私はちょうどビューで 'controller.class'をテストしたところ、名前空間でさえ動作するようです。心が試されますか? – tbuehlmann
これは素晴らしいです、あなたの答えを編集するplzは、受け入れられたものです。 – Kostas