Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

昨年末に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)を追加すればつかえるようになるそうです。

rjge
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away