web-dev-qa-db-ja.com

RailsモジュールからURLヘルパーにアクセスする方法

機能付きのモジュールがあります。 /lib/contact.rbにあります:

module Contact
  class << self
    def run(current_user)
      ...
    end
  end
end

モジュール内の 'users_path'のようなURLヘルパーにアクセスしたい。それ、どうやったら出来るの?

61
sizzle

モジュールで、次を実行します。

 include Rails.application.routes.url_helpers
113
ronnieonrails

Url_helpersへの委任は、モジュール全体をモデルに含めるよりもはるかに良いようです

delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

参照

27
Naveed

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
25
Anton Chikin

私はヘルパーがデフォルトのコントローラーとスタック(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

すべてのケースに当てはまるわけではありませんが、一種のカスタムレンダラーを実装するときに役立ちました。

とにかく:

  • デフォルトのURLオプションにシームレスにアクセスしたい場合、またはリクエストのホストにアクセスしたい場合は、コントローラ/リクエストコンテキストを
  • パスのみが必要で、ホストがなく、URLオプションを気にしない場合は、いくつかのダミーメソッドを作成できます。
5
Jonathan Allard
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

augustin Riedingerに、委任コードはurl_helpers(複数)を参照する必要があります。そうでない場合は、

未定義のメソッド「url_helper」

3
Jerome