名前付きルーティング
Railsではpath/to/foo
を表示するためにfoo_path
のような便利なメソッド(Url Helper)があります。
しかしこの機能はController、HelperとViewでしか使えません。もしmodelや自作moduleでfoo_path
を呼ぶと、下記エラーが発生します。
class Foo
def self.show_path_1
foo_path
end
def show_path_2
foo_path
end
end
Foo.show_path_1
# => NameError: undefined local variable or method `foo_path' for Foo:Class
foo = Foo.new
foo.show_path_2
# => NameError: undefined local variable or method `foo_path' for #<Foo:0x007fccd191b8b0>
一般的な解決法
Url Helper
はRails.application.routes.url_helpers
より提供されていますので、下記書き方で解決できます。
Rails.application.routes.url_helpers.foo_path
# => path/to/foo
ちなみにrails console
の場合、app.foo_path
でもつかえます。
もっと自然な書き方
pathを書くたびにRails.application.routes.url_helpers
を書くのはやっぱり不自然ですね。ControllerやViewのようにfoo_path
を直接書く方法があるでしょう?
一言いうと、あります。Gem Sitemap Generatorを使う時、sitemap.rb
の中でfoo_path
を書けます。
もしクラスメソッドで使いたい場合、この書き方で
class Foo
class << self
include Rails.application.routes.url_helpers
end
def self.show_path_1
foo_path
end
end
Foo.show_path_1
# => path/to/foo
もしインスタンスメソッドの中で使いたい場合、こちらの書き方で
class Foo
include Rails.application.routes.url_helpers
def show_path_2
foo_path
end
end
foo = Foo.new
foo.show_path_2
# => path/to/foo