2011-11-22 18 views
28

私が書いているものとは別のコントローラにメソッドがあり、そのメソッドを呼びたい場合は可能ですか、そのメソッドをヘルパー?別のコントローラからメソッドを呼び出す

+1

他のコントローラのメソッドを呼び出すことで、解決したい問題に事実を追加できますか?現在はかなりあいまいで、解決方法は問題に依存します。 – mliebelt

+0

実際、あなたが解決しようとしていることを詳しく教えてください。共有メソッドは何をしていますか? – nathanvda

答えて

45

技術的には、他のコントローラのインスタンスを作成し、そのメソッドを呼び出すことはできますが、面倒でエラーが発生しやすく、お勧めできません。

この機能が両方のコントローラに共通の場合は、ApplicationControllerまたは作成した別のスーパークラスコントローラにその機能があるはずです。 jimwormが示唆されているように、それを行うには

class ApplicationController < ActionController::Base 
    def common_to_all_controllers 
    # some code 
    end 
end 

class SuperController < ApplicationController 
    def common_to_some_controllers 
    # some other code 
    end 
end 

class MyController < SuperController 
    # has access to common_to_all_controllers and common_to_some_controllers 
end 

class MyOtherController < ApplicationController 
    # has access to common_to_all_controllers only 
end 

さらにもう1つの方法は、一般的な機能のためにモジュールを使用することです。

# lib/common_stuff.rb 
module CommonStuff 
    def common_thing 
    # code 
    end 
end 

# app/controllers/my_controller.rb 
require 'common_stuff' 
class MyController < ApplicationController 
    include CommonStuff 
    # has access to common_thing 
end 
+5

または 'module'からインクルードされています。 – jimworm

+0

'GoodSuggestionを含む' Thanks @jimworm – edgerunner

+1

他のコントローラのインスタンスを作成する???? Arrrrrrrgggh(確かに)。もう一つの選択肢は、質問があまりにも漠然としているからです。 – nathanvda

2

は試してみて、徐々にあなたのモデルにメソッドを移動し、彼らがモデルに適用されないならば、ヘルパー、それはまだApplicationControllerに

+1

コントローラからヘルパーにコードを移すことは決してありません。むしろ '/ lib'にあるモジュールです。ビューコードのみがヘルパーに存在する必要があります。 – nathanvda

+1

ヘルパーに何かを置くのは短命です。あなたはlib /モジュールにすべてを投げ入れる必要はありませんポイントになるでしょうもあまり良いです。 –

+1

私はヘルパーよりもモジュールを使うほうが好きです。なぜなら彼らは本当のOOなので、私はそれらを自由に含める/拡張することができるからです。私は実際の意味を持つものをグループ化することができます。ヘルパーは単なるバケツです。ビュー関連のメソッドにのみ使用することをお勧めします。 「あなたがポイントに達するだろう......」とあなたが何を意味するのかはっきりしない。 – nathanvda

0

に入れて他の場所でアクセスする必要がある場合、私はしないでくださいあなたの問題の詳細を知っているかもしれませんが、おそらく経路があなたのケースで解決できる可能性があります(特にそのRESTfulアクションがある場合)。

http://guides.rubyonrails.org/routing.html#paths-and-urls

0

あなた要件は、いくつかのDB操作に関係している場合は、そのモデル内の共通機能(クラスメソッド)を書くことができます。モデル内で定義された関数は、すべてのコントローラにアクセス可能です。しかし、この解決法はすべての場合に適用されます。

関連する問題