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

时间:2010-04-23 00:10:04

标签: ruby-on-rails model paperclip

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

该模型可能会在多个rails应用中使用

我需要将完整(非相对)url返回到附件,作为在其他地方使用的JSON API的一部分。

我想抽象回形针方面,并有一个像这样的简单虚拟属性:

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

然而,这只给了我相对路径。因为它在模型中我不能使用URL帮助器方法,对吗?

因为我没有帮助支持,所以在预先设置应用程序根URL的好方法是什么?我想避免硬编码或将代码添加到组装我的JSON的控制器方法。

谢谢

3 个答案:

答案 0 :(得分:6)

url helper从传入请求中获取主机名。模型不需要存在请求,因此您无法使用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"

答案 1 :(得分:2)

在Rails 3.0中,上面给出的包含会导致弃用警告。

在Rails 3.0中,使用以下代码来包含url helpers:

class Photo < ActiveRecord::Base
  include Rails.application.routes.url_helpers
end

答案 2 :(得分:0)

我发现你可以在具有以下内容的模型中使用URL帮助器:

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

  def thumb_url
     thumb_url(self)
  end
end

虽然小心 - 我发现这个拿起主机,但不是端口。您可以调查ActionController :: default_url_options以获取更多详细信息。