У меня есть модель, которая имеет вложения скрепки.
Модель могла бы использоваться в нескольких приложениях для направляющих
Я должен возвратить полный (неотносительный) URL вложению как часть API JSON, используемого в другое место.
Я хотел бы абстрагировать аспект скрепки и иметь простой виртуальный атрибут как это:
def thumbnail_url
self.photo.url(:thumb)
end
Это однако только дает мне относительный путь. Так как это находится в модели, я не могу использовать вспомогательные методы URL, правильно?
Каков был бы хороший подход к предварительному ожиданию URL корневого каталога приложения, так как я не сделал, чтобы помощник поддерживал? Я хотел бы избежать жесткого кодирования что-то или добавляющий код к методу контроллера, который собирает мой JSON.
Спасибо
Помощник 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"