2013-05-23 12 views
18

In un'applicazione Rails 3.2 ho bisogno di accedere a url_helpers in un file lib. Sto usandocome utilizzare gli helper URL nei moduli lib e impostare l'host per più ambienti

Rails.application.routes.url_helpers.model_url(model) 

ma sto ottenendo

ArgumentError (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true): 

ho trovato un paio di cose scritte su questo, ma nulla che in realtà spiega come risolvere questo per più ambienti.

Immagino di dover aggiungere qualcosa ai miei file development.rb e production.rb, ma cosa?

Più vicino ho visto una risposta suggerita utilizzando config.action_mailer.default_url_option, ma questo non funziona al di fuori del mailer di azione.

Qual è il modo corretto di impostare l'host per più ambienti?

risposta

33

Questo è un problema che continuo a subire e mi ha infastidito per un po '.

So che molti diranno che va contro l'architettura MVC per accedere a url_helpers in modelli e moduli, ma ci sono dei momenti, come quando si interfaccia con un'API esterna, dove ha senso.

E ora grazie a this great blog post ho trovato una risposta!

#lib/routing.rb 

module Routing 
    extend ActiveSupport::Concern 
    include Rails.application.routes.url_helpers 

    included do 
    def default_url_options 
     ActionMailer::Base.default_url_options 
    end 
    end 
end 

#lib/url_generator.rb 

class UrlGenerator 
    include Routing 
end 

ora posso chiamare il seguente in qualsiasi modello, modulo, di classe, console, ecc

UrlGenerator.new.models_url 

risultato!

+0

posso confermare questo funziona, ma ho avuto un errore di brutto dove ho avuto una classe con un metodo 'def self.name'. Durante la creazione di una rotta da un'istanza di questa classe, il generatore di url esploderebbe. Soluzione: rinominare 'def self.name' in qualcos'altro. – zwippie

17

Un lieve miglioramento (almeno per me) su bella risposta di Andy

module UrlHelpers 

    extend ActiveSupport::Concern 

    class Base 
    include Rails.application.routes.url_helpers 

    def default_url_options 
     ActionMailer::Base.default_url_options 
    end 
    end 

    def url_helpers 
    @url_helpers ||= UrlHelpers::Base.new 
    end 

    def self.method_missing method, *args, &block 
    @url_helpers ||= UrlHelpers::Base.new 

    if @url_helpers.respond_to?(method) 
     @url_helpers.send(method, *args, &block) 
    else 
     super method, *args, &block 
    end 
    end 

end 

e il modo in cui lo si utilizza è:

include UrlHelpers 
url_helpers.posts_url # returns https://blabla.com/posts 

o semplicemente

UrlHelpers.posts_url # returns https://blabla.com/posts 

Grazie Andy! +1

+0

Sai se funziona su Rails 4? –

+0

Sì, funziona su binari 4. – pratik

+0

Non riuscivo a farlo funzionare a meno che non avessi richiesto 'url_helpers'' nel file in cui avevo bisogno. –

1

Utilizzare questa stringa in qualsiasi controller di modulo per ottenere che gli helper URL delle applicazioni funzionino in qualsiasi vista o controller.

include Rails.application.routes.url_helpers 

Si prega di notare che alcuni url-helper del modulo interno dovrebbero essere namespace.

Esempio: applicazione radice

rotte.rb

Rails.application.routes.draw do 
get 'action' => "contr#action", :as => 'welcome' 
mount Eb::Core::Engine => "/" , :as => 'eb' 
end 

aiutanti URL nel modulo Eb:

users_path 

Aggiungi include Rails.application.routes.url_helpers controller contr

Così, dopo che aiutante dovrebbe essere

eb.users_path 

Così all'interno del modulo Eb voi puoi se welcome_path come nell'applicazione root!

1

Non sono sicuro se questo funziona in Rails 3.2, ma nelle versioni successive l'impostazione delle opzioni di url predefinite per i percorsi può essere effettuata direttamente nell'istanza di instradamento..

Così, per esempio, per impostare le stesse opzioni per ActionMailer:

Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options 
+0

Ho aggiunto questo a un inizializzatore. A mio parere, le altre risposte sono incomplete senza questo perché è necessario l'host per utilizzare gli helper '* _url', ed è probabilmente già configurato per inviare email. –

Problemi correlati