昨年末にRailsチュートリアル第4版をやっていて調べたヘルパー関連のまとめお蔵出し。
- ControllerからのHelperメソッドを呼び出す場合、どのHelperでも呼び出せるのか。
- Helperはメソッド名だけで呼び出しを行うことができるが、同名のメソッドが存在した場合どのようになるか(エラーになる or ならない or その他)
- 同名メソッドが存在した場合の呼び出し優先順位は存在するか。
前提
- Railsチュートリアル第4版第9章くらいまでの知識
- 環境は以下のとおり
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
$ rails -v
Rails 5.0.0.1
まとめ
View/Controller共通
- 同一ファイル同名メソッド、別ファイル同名メソッド、共にエラーにはならない
- 優先順位は、後優先(後で読み込んだものが勝つ)
Controllerからの場合
- includeしたHelperのみ使用可能
class ApplicationController < ActionController::Base
include TestsHelper
end
- 読込順は記述順
- 同一ファイル同名メソッド : 最後に記述されたもの
- 別ファイル同名メソッド : 最後にincludeされたファイルのメソッド
Viewからの場合
- 基本的にはすべてのアプリケーションヘルパーが利用可能(includeは不要)
- 読込順はアルファベット順(ファイル)
- 同一ファイル同名メソッド : 最後に記述されたもの
- 別ファイル同名メソッド : アルファベット順(a-z)
- 補足)ファイル名とヘルパー名が一致していなかった場合、エラーとなるため、ファイル名とヘルパー名の差異による読み込み順の変動はない。
確認過程
通常の読み込み
Helper
module TestsHelper
def hoge
return false
end
end
Controller
class HogeController < ApplicationController
include TestsHelper
def help
hoge
end
end
>> hoge => false
View
<% hoge %>
>> hoge => false
同一ファイル同名メソッド
Helper
module TestsHelper
def hoge
return false
end
def hoge
return true
end
end
Controller
class HogeController < ApplicationController
include TestsHelper
def help
hoge
end
end
>> hoge => true
View
<% hoge %>
>> hoge => true
別ファイル同名メソッド
Helper
module TestsHelper
def hoge
return false
end
module Tests2Helper
def hoge
return true
end
Controller
ケース1: 一方のみ include
includeされたものしか適用されない。
class HogeController < ApplicationController
include Tests2Helper
def help
hoge
end
end
>> hoge => true
ケース2: 両方 include
記述順にincludeされる。
class HogeController < ApplicationController
include Tests2Helper
include TestsHelper
def help
hoge
end
end
>> hoge => false
View
すべてのHelperが、アルファベット順にincludeされる。
<% hoge %>
>> hoge => true
おまけ
(Rails5で発生するか未確認だけど、ヘルパー関連なのでメモ)
ActionMailerのViewでHelperを使おうとするとundefinedになる。
ActionMailerのViewでHelperを使いたい場合には、以下のように add_template_helper(ApplicationHelper)
を追加する必要がある。
class HogeMailer < ActionMailer::Base
add_template_helper(ApplicationHelper)
...
end
参考サイト(感謝!)
http://morizyun.github.io/blog/action-mailer-rails-mail/
補足:ActionMailerのView内でHelperメソッドを使う場合
ActionMailerのView内でhelperメソッドを使いたい場合は、add_template_helper(ApplicationHelper)を追加すればつかえるようになるそうです。