2010-04-23 14 views
6

Ho un modello con allegati a graffetta.Rails: creazione di un url assoluto nell'attributo virtuale di un modello senza helper helper

Il modello potrebbe essere utilizzato in molteplici applicazioni Rails

ho bisogno di tornare a (non parente) URL completo per l'allegato come parte di un API JSON essere consumato altrove.

mi piacerebbe astratta all'aspetto graffetta e avere un semplice attributo virtuale come questo:

def thumbnail_url 
    self.photo.url(:thumb) 
    end 

Questo però mi dà solo il percorso relativo. Dal momento che è nel modello, non posso usare i metodi di supporto URL, giusto?

Quale sarebbe un buon approccio per anteporre l'URL radice dell'applicazione poiché non ho il supporto di supporto? Vorrei evitare qualcosa di hardcoding o aggiungere codice al metodo controller che assembla il mio JSON.

Grazie

risposta

6

L'helper URL prende il nome host dal richiesta in arrivo. Un modello non ha bisogno di una richiesta per esistere, quindi perché non è possibile utilizzare gli helper URL.

Una soluzione è passare il nome host della richiesta all'helper dell'url di anteprima.

def thumbnail_url(hostname) 
    self.photo.url(:thumb, :host => hostname) 
end 

quindi chiamare da controller/viste come questo

photo.thumbnail_url(request.host) 

Si scopre che in realtà non c'è un modo infallibile per ottenere il nome host di un server. Se un utente aggiunge una voce al proprio file/etc/hosts, può accedere al server con qualsiasi nome host desiderato. Se si fa riferimento al nome host della richiesta in entrata, potrebbe essere utilizzato per rompere le miniature.

Per questo motivo, in genere eseguo l'hardcode del nome host del mio sito in un inizializzatore. per esempio. mettere questo in config/inizializzatori/hostname.rb

HOSTNAME = 'whatever' 

- modifica -

E looke come in rotaie 3 è necessario fornire il: only_path => Il parametro per ottenere questo al lavoro . Ecco un esempio dalla console:

>> app.clients_path :host => 'google.com', :only_path => false 
=> "http://google.com/clients" 
+0

Grazie per la vostra writeup. Questi due approcci sono comprensibili. Capisco la limitazione del modello e questo è un modo logico per affrontarlo.A volte il mio cervello vuole solo piegare un po 'le regole MVC :). – Nick

+0

Sto usando la memoria come filesystem locale e non funziona per me. Qualche suggerimento? – MKumar

+0

Questo non sembra funzionare. –

0

ho trovato si può avere aiutanti URL nei modelli con il seguente:

class Photo < ActiveRecord::Base 
    include ActionController::UrlWriter 

    def thumb_url 
    thumb_url(self) 
    end 
end 

Attenzione però - Ho trovato questo prese il HOST, ma non la porta. Puoi investigare su ActionController :: default_url_options per maggiori dettagli.

2

In Rails 3.0, l'inclusione sopra riportata genera un avviso di ritiro.

In Rails 3.0, utilizzare il seguente codice invece di includere aiutanti url:

class Photo < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
end 
Problemi correlati