如何使用rails 3显示路径在Ruby on Rails项目目录之外的图像?

时间:2012-02-26 15:32:13

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 html-helper

如何显示存储在项目目录外的图像?

有一种简单的方法吗?

3 个答案:

答案 0 :(得分:9)

我看到两种方式:

  • 在rails服务器之上,在生产环境中,有时在dev中,你必须使用像apache或nginx这样的web服务器。有了这些,您可以为其他目录提供特定URL的文件。例如。您可以从特定目录中提供http://yourapp.com/images/服务文件。在rails中,使用传统image_tag
  • 显示图像

Nginx示例:

    # Find the right `server` section which you currently use to serve your rails app
server {
      listen 80;

      # Add this
      location /images {
        root /var/www/my/specific/folder;
      }

      location / {
        #...
        #... Here you should already some code to proxy to your rails server
      }
    }

With that, when you access to `yourserver.com/images`, nginx serve your specific folder and not your rails app. Then in your app view :

    <%= image_tag 'http://yourserver.com/images/my_pic.jpg' %>
  • 如果您无法访问服务器设置,则可以使用send_file

    从控制器操作提供图像文件

    在控制器中:

    class ImagesController < ApplicationController
      def show
        send_file File.join('/var/www/my/specific/folder',params[:name]), :disposition => 'inline'
      end
    end
    

    config/routes.rb

    match '/images/:name' => 'images#show', :as => :custom_image
    

    然后当您访问此操作时(通过您在config/routes.rb中定义的路线),您就拥有了该图像。因此,在您的视图中,您使用以下网址进行传统image_tag

    <%= image_tag custom_image_path( 'my_pic.jpg' ) %>
    OR
    <%= image_tag custom_image_url( 'my_pic.jpg' ) %>
    

答案 1 :(得分:0)

如果它存储在Rails应用程序目录之外,那么它不属于资产管道,您可以直接链接到它:

<%= image_tag("http://example.com/some_file.jpg") %>

显然它必须可以通过HTTP访问(您需要安装nginx或Apache服务器)。

答案 2 :(得分:0)

这可能是个坏主意,并会导致一系列问题。一些安全性,一些功能,但我实际上不知道的大部分效果。
根据经验,我确实知道,无论何时你违背轨道惯例来了解事物的内容和地点,这是一个很容易打破的滑坡,最好避免。

使用提供的框架创建解决方案。

请注意,如果您使用rails 3.1+而不是&lt; = 3.0,则由于资产编译将js,css和图像复制到公共场所,此功能也会受到影响。