概要
複数のコントローラーやビューで共通に利用したいヘルパーの置き場所について。単純なヘルパーの場合、以下の場所が候補になる。
app/helpers
下のビューに対応した***_helper.rbに記述app/helpers/application_helper.rb
内に記述app/controllers/concerns
下のモジュールファイルに記述(コントローラー
依存関係を持つような場合はconcerns
に置くのがよいようだが、単純なヘルパーの場合はビューとの関連によってapplication_helper.rb
に統一するのが簡明かもしれない。
コントローラーに対応したhelper
ヘルパーファイルにヘルパーを記述してapplication_controllerでインクルードすると、コントローラーやビューでこれを使うことができる。
以下はPagesコントローラーの例で、コントローラーとビューの両方でfoo_helperの実行が確認できる。
定義・設定
helpersディレクトリー内にあるコントローラー_helper.rb
の中でヘルパーを定義する。
app/helpers/pages_helper.rb
1 2 3 4 5 |
module PagesHelper def foo_helper "FOO" end end |
application_controller
でモジュールをインクルード。
app/controllers/application_controller.rb
1 2 3 4 5 |
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include PagesHelper end |
利用
コントローラーで利用可能。
app/controllers/pages_controller.rb
1 2 3 4 5 |
class PagesController < ApplicationController def helper_test p foo_helper end end |
ビューでも利用可能。
app/views/pages/helper_test.html.erb
1 2 3 |
<h1>Helper Test</h1> <p><%= foo_helper %></p> |
application_helper
application_helper
もヘルパーファイルの1つで、Railsにより準備される。これを上と同じくapplication_controller
でインクルードして、アプリケーション共通のヘルパーとして使える。
定義・設定
helpersディレクトリー内にあるapplication_helper.rb
の中でヘルパーを定義する。
app/helpers/application_helper.rb
1 2 3 4 5 |
module ApplicationHelper def bar_helper "BAR" end end |
application_controller
でモジュールをインクルード。
app/controllers/application_controller.rb
1 2 3 4 5 |
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include ApplicationHelper end |
利用
コントローラーで利用可能。
app/controllers/pages_controller.rb
1 2 3 4 5 |
class PagesController < ApplicationController def helper_test p bar_helper end end |
ビューでも利用可能。
app/views/pages/helper_test.html.erb
1 2 3 |
<h1>Helper Test</h1> <p><%= bar_helper %></p> |
concerns
app/controllers/concerns
にはコントローラー間で共通のモジュール、app/models/concerns
はモデル間で共通のモジュールのファイルを配置する。
コントローラーなどでインクルードしてもビューではこれらのモジュールは使えない。
定義・設定
concernsディレクトリー下にモジュールファイルを作成して、その中にヘルパーを書く。
app/controller/concerns/common_module.rb
1 2 3 4 5 6 |
module CommonModule def baz_helper "BAZ" end end |
application_controller
でモジュールをインクルード。
app/controllers/application_controller.rb
1 2 3 4 5 |
class ApplicationController < ActionController::Base protect_from_forgery with: :exception include CommonModule end |
利用
コントローラーで利用可能。
app/controllers/pages_controller.rb
1 2 3 4 5 |
class PagesController < ApplicationController def helper_test p baz_helper end end |
しかしビューでは使えない。