機能付きのモジュールがあります。 /lib/contact.rbにあります:
module Contact
class << self
def run(current_user)
...
end
end
end
モジュール内の 'users_path'のようなURLヘルパーにアクセスしたい。それ、どうやったら出来るの?
モジュールで、次を実行します。
include Rails.application.routes.url_helpers
Url_helpersへの委任は、モジュール全体をモデルに含めるよりもはるかに良いようです
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
include
を使用せずにどのようなコンテキストでもそれを行う方法を次に示します。
routes = Rails.application.routes.url_helpers
url = routes.some_path
それはどのような状況でも機能します。 include
url_helpersをしようとしている場合-適切な場所でそれを行っていることを確認してください。これは動作します
module Contact
class << self
include Rails.application.routes.url_helpers
end
end
これは機能しません
module Contact
include Rails.application.routes.url_helpers
class << self
end
end
カピバラテストのもう1つの例
feature 'bla-bla' do
include Rails.application.routes.url_helpers
path = some_path #unknown local variable some_path
end
そして今、正しいもの
include Rails.application.routes.url_helpers
feature 'bla-bla' do
path = some_path #this is ok
end
私はヘルパーがデフォルトのコントローラーとスタック(default_url_options
など)に期待している機能に苦労しており、ホストをハードコードしたくありませんでした。
もちろん、URLヘルパーはniftyモジュールによって提供されます:
include Rails.application.routes.url_helpers
ただし、これをそのまま含めると、(1)ヘルパーはdefault_url_options
を検索し、(2)リクエストのホストもリクエストも知りません。
ホスト部分は、コントローラインスタンスのurl_options
から取得されます。したがって、コントローラーコンテキストを以前のモジュール(現在はクラス)に渡します。
class ApplicationController
def do_nifty_things
HasAccessToRoutes.new(self).render
end
end
class HasAccessToRoutes
include Rails.application.routes.url_helpers
delegate :default_url_options, :url_options, to: :@context
def initialize(context)
@context = context
end
def render
nifty_things_url
end
end
すべてのケースに当てはまるわけではありませんが、一種のカスタムレンダラーを実装するときに役立ちました。
とにかく:
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
augustin Riedingerに、委任コードはurl_helpers(複数)を参照する必要があります。そうでない場合は、
未定義のメソッド「url_helper」