Rails - построение абсолютного URL в виртуальном атрибуте модели без помощника url - PullRequest
6 голосов
/ 23 апреля 2010

У меня есть модель с прикрепленными скрепками.

Модель может использоваться в приложениях с несколькими рельсами

Мне нужно вернуть полный (не относительный) URL-адрес вложения как часть JSON API, используемого в другом месте.

Я хотел бы абстрагировать аспект скрепки и иметь простой виртуальный атрибут, подобный этому:

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

Это, однако, только дает мне относительный путь. Так как в модели я не могу использовать вспомогательные методы URL, верно?

Каков будет хороший подход к добавлению корневого URL приложения, поскольку у меня нет вспомогательной поддержки? Я хотел бы избежать жесткого кодирования чего-либо или добавления кода в метод контроллера, который собирает мой JSON.

Спасибо

Ответы [ 3 ]

6 голосов
/ 23 апреля 2010

Помощник по URL берет имя хоста из входящего запроса. Модель не нуждается в запросе на существование, поэтому вы не можете использовать помощники URL.

Одним из решений является передача имени хоста запроса помощнику по URL-адресу миниатюр.

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

Затем вызовите его из ваших контроллеров / представлений, как это

photo.thumbnail_url(request.host)

Оказывается, что на самом деле нет надежного способа получить имя хоста сервера. Если пользователь добавляет запись в свой файл / etc / hosts, он может получить доступ к серверу с любым именем хоста. Если вы полагаетесь на имя хоста входящего запроса, его можно использовать для разрыва миниатюр.

Из-за этого я обычно жестко кодирую имя хоста моего сайта в инициализаторе. например поместите это в config / initializers / hostname.rb

HOSTNAME = 'whatever'

- редактировать -

Это выглядит как в rails 3, вы должны предоставить параметр: only_path => false, чтобы заставить это работать. Вот пример из консоли:

>> app.clients_path :host => 'google.com', :only_path => false
=> "http://google.com/clients"
2 голосов
/ 12 июля 2011

В Rails 3.0 приведенное выше включение приводит к предупреждению об устаревании.

В Rails 3.0 вместо этого используйте следующий код для включения помощников по URL:

class Photo < ActiveRecord::Base
  include Rails.application.routes.url_helpers
end
0 голосов
/ 15 октября 2010

Я обнаружил, что у вас могут быть помощники URL в моделях со следующими параметрами:

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

  def thumb_url
     thumb_url(self)
  end
end

Внимание! Я обнаружил, что это поднял HOST, но не порт.Вы можете изучить ActionController :: default_url_options для более подробной информации.

...