QA@IT

コントローラーからビューのヘルパーを呼ぶには?

5084 PV

Rails 3.2を使っています。コントローラーからビューのヘルパーを呼ぶことはできますか? どうも NoMethodError が出てしまって呼べないようです。

回答

基本的には、ヘルパーのメソッドは「ビューの表示(≒HTMLの組立)に必要なロジックのセット」だと考えてください(より踏み込んだ設計をする流派もありますが、いちばんシンプルな捉え方です)。
そのため、「Webアプリケーションとしての振る舞いの流れを制御する役割であるコントローラ」からはヘルパーのメソッドは呼べないと考えてください。

とはいえ、セッション情報やクエリパラメータにアクセスする場合など、コントローラとビューで共通のロジックをかけると便利なことは確かです。そういう場合には、コントローラにロジックを追加し、helper_method()宣言するのが好みです。

たとえば、セッション中のuser_idからログイン中のユーザを返すメソッドcurrent_user()をコントローラとビューの両方から呼ぶには次のようにします。

class ApplicationController < ActionController::Base
  helper_method :current_user
  private

  def current_user
     return nil unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
  end
end

または、私の個人的な好みからは大きくハズレますが、ヘルパーの実体はRubyのモジュールですので、ApplicationHelperをふつうにincludeすれば使えてしまいます。

編集 履歴 (0)

view_context を使う方法があります。

たとえば、Facebook のウォールに投稿するために、コントローラ内で「画像のパス」を扱いたいときがあったりして、そんなときは以下のようにして取得できます。

view_context.image_path("logo.gif")
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。