我有一个带有回形针附件的模型。
该模型可能用于多个 Rails 应用程序
我需要向附件返回一个完整的(非相对)url,作为在其他地方使用的 JSON API 的一部分。
我想抽象回形针方面并有一个简单的虚拟属性,如下所示:
def thumbnail_url
self.photo.url(:thumb)
end
然而,这只给了我相对路径。因为它在模型中,所以我不能使用 URL 辅助方法,对吗?
由于我没有帮助程序支持,在应用程序根 url 之前添加什么是一种好方法?我想避免对某些内容进行硬编码或向组装我的 JSON 的 Controller 方法添加代码。
谢谢
最佳答案
url 助手从传入的请求中获取主机名。模型不需要存在请求,因此您不能使用 URL 助手。
一种解决方案是将请求主机名传递给缩略图 url 帮助程序。
def thumbnail_url(hostname)
self.photo.url(:thumb, :host => hostname)
end
然后从您的 Controller / View 中调用它
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"
关于ruby-on-rails - Rails - 在没有 url helper 的情况下在模型的虚拟属性中构建绝对 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695393/