2011-12-15 8 views
0

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

編集:私はどのようにわからないけど

controller_name.constantize 

:コントローラは名前空間されたときにソリューションも(。例えばAdmin::PostsController)動作するはず

答えて

3

あなたは次のように、constantize方法を使用することができます名前空間のコントローラを使用すると動作します。

更新:

1は、すべてのコントローラ名および/または名前空間のために動作しません。一つは#classと組み合わせて#controllerメソッドを使用することができますが:

純粋なRubyで
controller.class 
+0

'controller_name'は役に立ちません。なぜなら' Admin :: PostsController'は単に 'posts '。これをコンスタント化すると、コントローラを取得するには不十分な 'Posts'が返されます。 – Kostas

+1

あなたは正しいです!私はちょうどビューで 'controller.class'をテストしたところ、名前空間でさえ動作するようです。心が試されますか? – tbuehlmann

+1

これは素晴らしいです、あなたの答えを編集するplzは、受け入れられたものです。 – Kostas

1

、クラス名は定数であるので、あなたは文字列からクラスを取得するには、この操作を行うことができます。

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 
+0

しかし、どこから文字列を取得するのですか?たとえば、 "Admin :: PostsController"? – Kostas

+0

その答えをくれた人は-1ですか?これはもう少し知りたいと思っているすべての人にとって、有効かつ良い情報です。そして文字列、vrinekは、あなたがあなたの質問に述べたように 'controller_name'から得ます。 –

+0

@vrinek私の編集した回答を参照 – maprihoda

1

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

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

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

+0

私はあなたがなぜこれをする必要があるのだろうと思っています... –

+0

ええ、あなたのヘルパーで 'controller_name'を使う必要があるかもしれません。たとえば、私は、user_nameというヘルパーが、controller_nameを使用して認証リンクをいつ印刷するかを決定します – maprihoda

関連する問題