2009-02-10 67 views
14

我已经通过了一些有趣的路由问题的工作我的方式 - 把一个请求URL到一个哈希等,但只是出于好奇,有没有一种方法可以告诉路由系统,你希望任何来自某个url子路径的东西都可以直接使用 - 而不需要通过控制器?例如,如果我有/home/me/public_html/rails_proj/images/foo.jpg,和.../rails_proj/images/other/bar.jpg,我可以插入一条路线,指出“下面的任何东西应该只将图像作为默认MIME类型的对象?“的Rails:一个路由服务静态资产(?像.jpgs等)

可能很有趣。

回答

15

如果你把“图像”目录到Rails应用程序的“公共”文件夹(例如:/公共/图片/),那么你不应该有MIME类型的任何问题,除非你的web服务器配置错误。

根据你的例子,要在应用程序的根目录中的图像。我认为Rails没有办法让这些图像可见,但如果你真的想要你可以使用mod_rewrite来使它工作。再一次,这将取决于网络服务器,以确保图像具有正确的MIME类型。对投放在公众目录不会通过Rails的走

+0

我很好,将图像移动到公用文件夹。我会做一些搜索 - 在那里放置资产仍然给我一个“没有路由匹配.............用{:method =>:get} – Sniggerfardimungus 2009-02-10 06:40:38

+1

公用文件夹的问题是我正在尝试url/public/...我抛弃了/ public /的显式使用,它工作得很好。 – Sniggerfardimungus 2009-02-10 06:46:52

6

事 - 他们就会通过你的服务器来处理(可能是Apache)的。您需要通过导轨系统提供图片的唯一原因是您想要对访问者进行某种控制。只需将所有内容公开并访问ala: siteurl.whatever/images/*。jpg

1

警告:如果您的请求URL与静态资源相匹配,WEBrick,mongrel或其他任何人都会很乐意为其提供服务。不惜任何代价,您不希望在制作过程中使用它:如果您的流量足够高,您的应用就会因为它的杂种将忙于提供静态内容而受到折磨。

因此,请确保您的网络服务器正确配置了各种静态内容与之前评论者所指出的。

5

我通常使用nginx作为前端,Apache/Passenger作为后端。 Ngingx代理所有的Rails请求到Apache,但它自己处理所有的静态内容。查看the English nginx wiki上的示例。这里是一个小节选nginx的配置:

server { 
    listen 80; 
    server_name www.domain.com; 
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js)$ { 
     root /path/to/static/assets/dir; 
    } 
    location/{ 
     proxy_pass http://127.0.0.1:81; 
    } 
} 

所以有阿帕奇侦听端口81来处理Rails的请求,nginx的代理,让nginx的提供静态内容。不仅nginx在提供静态内容方面比Apache更快,而且还可以为每个图像,样式表,JavaScript或任何其他静态内容卸载Rails应用程序。

2

我认为最简单的方法解决这个问题是在运用IMAGE_PATH helper方法,它为您提供了要在视图中显示的图像的路径。 例如,如果您想要在/assets/images/logo.png下引用logo.png,则可以使用image_path('logo.png')。