LoginSignup
76
46

More than 5 years have passed since last update.

Rails5.0でのヘルパー読み込みと優先順位

Posted at

昨年末に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のみ使用可能
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include TestsHelper
end
  • 読込順は記述順
    • 同一ファイル同名メソッド : 最後に記述されたもの
    • 別ファイル同名メソッド : 最後にincludeされたファイルのメソッド

Viewからの場合

  • 基本的にはすべてのアプリケーションヘルパーが利用可能(includeは不要)
  • 読込順はアルファベット順(ファイル)
    • 同一ファイル同名メソッド : 最後に記述されたもの
    • 別ファイル同名メソッド : アルファベット順(a-z)
  • 補足)ファイル名とヘルパー名が一致していなかった場合、エラーとなるため、ファイル名とヘルパー名の差異による読み込み順の変動はない。

確認過程

通常の読み込み

Helper

app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false    
  end
end

Controller

app/controllers/hoge_controller.rb
class HogeController < ApplicationController
  include TestsHelper
  def help
    hoge
  end
end

>> hoge => false

View

app/views/hoge/help.html.erb
<% hoge %>

>> hoge => false

同一ファイル同名メソッド

Helper

app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false    
  end

  def hoge
    return true    
  end
end

Controller

app/controllers/hoge_controller.rb
class HogeController < ApplicationController
  include TestsHelper
  def help
    hoge
  end
end

>> hoge => true

View

app/views/hoge/help.html.erb
<% hoge %>

>> hoge => true

別ファイル同名メソッド

Helper

app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false
  end
app/helpers/tests2_helper.rb
module Tests2Helper 
  def hoge
    return true
  end

Controller

ケース1: 一方のみ include

includeされたものしか適用されない。

app/controllers/hoge_controller.rb
class HogeController < ApplicationController
  include Tests2Helper
  def help
    hoge
  end
end

>> hoge => true

ケース2: 両方 include

記述順にincludeされる。

app/controllers/hoge_controller.rb
class HogeController < ApplicationController
  include Tests2Helper
  include TestsHelper
  def help
    hoge
  end
end

>> hoge => false

View

すべてのHelperが、アルファベット順にincludeされる。

app/views/hoge/help.html.erb
<% hoge %>

>> hoge => true

おまけ

(Rails5で発生するか未確認だけど、ヘルパー関連なのでメモ)
ActionMailerのViewでHelperを使おうとするとundefinedになる。
ActionMailerのViewでHelperを使いたい場合には、以下のように add_template_helper(ApplicationHelper) を追加する必要がある。

app/mailers/hoge_mailer.rb
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)を追加すればつかえるようになるそうです。

76
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
46