ruby-on-rails - Rails - 在没有 url helper 的情况下在模型的虚拟属性中构建绝对 url

标签 ruby-on-rails model paperclip

我有一个带有回形针附件的模型。

该模型可能用于多个 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/

相关文章:

javascript - 使用 jquery 部分渲染时未定义的局部变量或方法 `f'

jquery - Rails, CoffeeScript 出现语法错误

ruby-on-rails - 了解铁路路线

model - 相关记录参数

ruby-on-rails - 'NoMethodError : undefined method' in Ruby on Rails Model

ruby-on-rails - 如何为临时文件设置内容类型

ruby-on-rails - `fetch' : key not found: "S3_BUCKET_NAME" (KeyError) with paperclip/aws s3/rails

ruby-on-rails - 如何在不使用表单助手的情况下使用 Rails Paperclip 上传图像

ruby-on-rails - Rails仅在有条件的情况下验证唯一性

tensorflow - 优步 Ludwig 工具箱 : export generated model to Google platform ML Engine