2011-05-20 58 views
45

我有一個帶有功能的模塊。它位於/lib/contact.rb:如何從導軌模塊訪問URL助手

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

我要訪問的URL傭工喜歡在模塊內部「users_path」。我怎麼做?

+1

可能重複的[Can Rails路由助手(即mymodel \ _path(模型))在模型中使用?](http://stackoverflow.com/questions/341143/can-rails-routing-helpers-ie -mymodel-pathmodel-in-models-in) – 2013-07-05 16:59:49

回答

84

在你的模塊,只需執行:

include Rails.application.routes.url_helpers 
+0

謝謝,這樣做! – sizzle 2011-05-20 16:45:31

+0

快樂...... ;-) – ronnieonrails 2011-05-20 16:47:27

+2

不適合我... :(你能否提供更多的細節,請問? – 2014-02-13 17:58:44

24

代表團url_helpers似乎比包括整個模塊到模型更好

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

reference

+0

不適用於我:( – 2014-02-13 18:04:41

+0

應該是'url_helpers'而不是'url_helper',我想。 – davmac 2014-12-03 12:47:21

+0

嗨,你是怎麼知道這是Rails.application.routes url_helpers應該委託給你?你在哪裏找到這個文檔?謝謝! – 2015-12-09 20:33:38

23

這裏是我該怎麼辦它在任何情況下都沒有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 

再舉一個例子與水豚測試

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 
3
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url => 'www.foo.com/users' 

到奧古斯丁Riedinger,該代表團代碼需要參照url_helpers(複數),否則你會得到

未定義的方法`url_helper」

2

我一直在用輔助期待的細微掙扎來自默認的控制器和堆棧(default_url_options等),並且不想對主機進行硬編碼。

我們的網址助手是我們漂亮的模塊提供,當然:

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選項,你可以製作一些虛擬方法。