Направляющие - создание абсолютного URL в виртуальном атрибуте модели без помощника URL

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

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

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

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

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

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

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

Спасибо

6
задан Nick 23 April 2010 в 00:10
поделиться

1 ответ

Помощник 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'

- edit -

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

>> app.clients_path :host => 'google.com', :only_path => false
=> "http://google.com/clients"
6
ответ дан 16 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: