2010-04-23 6 views
6

Ich habe ein Modell mit Büroklammerbefestigungen.Rails - Erstellen einer absoluten URL im virtuellen Attribut eines Modells ohne URL-Helper

Das Modell kann sich in mehreren Schienen verwendet werden apps

Ich brauche eine volle (nicht relative) URL der Anlage als Teil eines JSON-API zurück anderswo verbraucht wird.

ich abstrahieren die Büroklammer Aspekt möchten und haben eine einfache virtuelle Attribut wie folgt aus:

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

Dies jedoch gibt mir nur den relativen Pfad. Da es im Modell ist, kann ich die URL-Hilfsmethoden nicht verwenden, oder?

Was wäre ein guter Ansatz zum Voranstellen der Anwendungsstamm-URL, da ich keine Helferunterstützung habe? Ich möchte vermeiden, etwas hardcoding oder Code hinzufügen, um die Controller-Methode, die meine JSON assembliert.

Danke

Antwort

6

Die URL Helfer die Hostnamen aus der eingehenden Anfrage erfolgt. Ein Modell benötigt keine Anforderung, weshalb Sie die URL-Helfer nicht verwenden können.

Eine Lösung besteht darin, den Hostnamen der Anfrage an den Thumbnail-URL-Helper zu übergeben.

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

es dann rufen Sie von Ihrem Controller/Ansichten wie diese

photo.thumbnail_url(request.host) 

Es stellt sich heraus, dass es nicht wirklich eine narrensichere Weg, um den Host-Namen eines Servers zu erhalten. Wenn ein Benutzer der Datei/etc/hosts einen Eintrag hinzufügt, kann er auf den Server mit dem gewünschten Host-Namen zugreifen. Wenn Sie sich auf den Hostnamen der eingehenden Anfrage verlassen, könnte dies zum Brechen der Thumbnails verwendet werden.

Aus diesem Grund hardde ich in der Regel den Hostnamen meiner Site in einem Initialisierer fest. z.B. setzen diese in config/initializers/hostname.rb

HOSTNAME = 'whatever' 

- bearbeiten -

Es ist wie looke in Schienen 3 Sie bieten müssen die: only_path => false Parameter dies zur Arbeit zu kommen . Hier ist ein Beispiel aus der Konsole:

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

Vielen Dank für Ihre Zuschreibung. Diese zwei Ansätze machen Sinn, ich verstehe die Modellbeschränkung, und dies ist ein logischer Weg, damit umzugehen.Manchmal möchte mein Gehirn nur die MVC-Regeln etwas verbiegen :). – Nick

+0

Ich benutze Speicher als lokales Dateisystem und es funktioniert nicht für mich. Irgendein Hinweis? – MKumar

+0

Dies scheint nicht zu funktionieren. –

0

Ich habe festgestellt, Sie URL Helfer bei den Modellen mit der folgenden haben:

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

    def thumb_url 
    thumb_url(self) 
    end 
end 

Vorsicht obwohl - ich fand diese den HOST abgeholt, aber nicht die Hafen. Sie können ActionController :: default_url_options für weitere Details untersuchen.

2

In Rails 3.0 führt das oben angegebene Include zu einer Verwarnungswarnung.

In Rails 3.0 verwenden Sie stattdessen den folgenden Code url Helfer sind:

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