2010-04-23 14 views
6

Tengo un modelo que tiene adjuntos de clips.Rieles: creación de una URL absoluta en el atributo virtual de un modelo sin url helper

El modelo podría ser utilizado en múltiples carriles apps de

necesito devolver una URL completa (no relativa) a la unión como parte de un API JSON ser consumido en otro lugar.

me gustaría abstracta el aspecto clip y tener un atributo virtual simple como esto:

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

Sin embargo, esto sólo me da la ruta relativa. Como está en el modelo, no puedo usar los métodos de ayuda de URL, ¿verdad?

¿Cuál sería un buen enfoque para anteponer la URL raíz de la aplicación ya que no tengo soporte de ayuda? Me gustaría evitar la codificación de algo o agregar código al método del controlador que ensambla mi JSON.

Gracias

Respuesta

6

El asistente de url lleva el nombre de host de la solicitud entrante. Un modelo no necesita una solicitud para existir, por lo que no puede usar los ayudantes de URL.

Una solución es pasar el nombre de host de solicitud al asistente de URL de miniaturas.

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

Entonces llamaremos a partir de los controladores/vistas como esta

photo.thumbnail_url(request.host) 

Resulta que en realidad no hay una manera infalible para obtener el nombre de host de un servidor. Si un usuario agrega una entrada a su archivo/etc/hosts, puede acceder al servidor con el nombre de host que desee. Si confía en el nombre de host de la solicitud entrante, podría usarse para dividir las miniaturas.

Debido a esto, generalmente código duro el nombre de host de mi sitio en un inicializador. p.ej. poner esto en config/inicializadores/hostname.rb

HOSTNAME = 'whatever' 

- editar -

Se looke al igual que en los carriles 3 tiene que proporcionar el: only_path => parámetro falsa para conseguir que esto funcione . He aquí un ejemplo de la consola:

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

Gracias por su valoración crítica. Esos 2 enfoques tienen sentido. Entiendo la limitación del modelo y esta es una manera lógica de manejarlo.A veces mi cerebro solo quiere doblar un poco las reglas de MVC :). – Nick

+0

Estoy usando el almacenamiento como sistema de archivos local y no funciona para mí. ¿Alguna pista? – MKumar

+0

Esto no parece funcionar. –

0

He encontrado que puede tener ayudantes de URL en modelos con lo siguiente:

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

    def thumb_url 
    thumb_url(self) 
    end 
end 

precaución sin embargo - me encontré con este recogió el anfitrión, pero no el Puerto. Puede investigar ActionController :: default_url_options para obtener más detalles.

2

En Rails 3.0, el incluido anteriormente da como resultado una advertencia de desactivación.

En Rails 3.0, utilice el siguiente código en lugar de incluir ayudantes url:

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