代码之家  ›  专栏  ›  技术社区  ›  Nick

rails-在没有url助手的模型的虚拟属性中构建绝对url

  •  6
  • Nick  · 技术社区  · 15 年前

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

    该模型可能用于多个rails应用程序

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

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

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

    但这只给了我相对的路径。因为它在模型中,所以我不能使用url helper方法,对吧?

    既然我没有helper支持,那么准备应用程序根url的好方法是什么?我希望避免硬编码或向汇编json的controller方法添加代码。

    谢谢你

    3 回复  |  直到 14 年前
        1
  •  6
  •   zaius    14 年前

    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'
    

    --编辑——

    在rails 3中,您需要提供:only_path=>false参数才能使其工作。下面是控制台中的一个示例:

    >> app.clients_path :host => 'google.com', :only_path => false
    => "http://google.com/clients"
    
        2
  •  2
  •   Majiy    14 年前

    在Rails3.0中,上面给出的include会导致一个弃用警告。

    在Rails 3.0中,请使用以下代码来包含URL帮助程序:

    class Photo < ActiveRecord::Base
      include Rails.application.routes.url_helpers
    end
    
        3
  •  0
  •   Dean Radcliffe    15 年前

    我发现您可以在模型中使用以下URL帮助程序:

    class Photo < ActiveRecord::Base
      include ActionController::UrlWriter
    
      def thumb_url
         thumb_url(self)
      end
    end
    

    不过要小心-我发现这是主机,不是端口。您可以调查actioncontroller::default_url_选项以了解更多详细信息。