Ruby on rails 为静态资产(如.jpgs等)提供服务的路径

Ruby on rails 为静态资产(如.jpgs等)提供服务的路径,ruby-on-rails,jpeg,routes,Ruby On Rails,Jpeg,Routes,我已经解决了许多有趣的路由问题——将请求URL转换为哈希,等等,但出于好奇,有没有一种方法可以告诉路由系统,您希望在某个URL子路径下的任何内容都能得到真正的服务,而无需经过控制器 例如,如果我有/home/me/public\u html/rails\u proj/images/foo.jpg和…/rails\u proj/images/other/bar.jpg,我是否可以插入一个路由,其中说明“图像下的任何内容都应该作为默认mime类型的对象使用?” 可能很有趣。如果将“images”目录

我已经解决了许多有趣的路由问题——将请求URL转换为哈希,等等,但出于好奇,有没有一种方法可以告诉路由系统,您希望在某个URL子路径下的任何内容都能得到真正的服务,而无需经过控制器

例如,如果我有/home/me/public\u html/rails\u proj/images/foo.jpg和…/rails\u proj/images/other/bar.jpg,我是否可以插入一个路由,其中说明“图像下的任何内容都应该作为默认mime类型的对象使用?”

可能很有趣。

如果将“images”目录放入Rails应用程序的“public”文件夹(例如:/public/images/),则MIME类型不会有任何问题,除非web服务器配置错误


根据您的示例,您希望images目录位于应用程序的根目录中。我不认为有办法通过Rails使这些图像可见,但如果你真的想,你可以使用mod_rewrite使其工作。再一次,由web服务器来确保图像具有正确的MIME类型。

公共目录之外提供的内容不会通过Rails—它们将由您的服务器(可能是apache)处理。您需要通过rails系统提供图像的唯一原因是,如果您想对谁可以访问图像进行某种控制。只需将所有其他内容公开并访问:
注意:如果您的请求URL与静态资源相匹配,WEBrick、mongrel或其他任何东西都会很乐意为您提供服务。无论如何,你都不希望在生产中出现这种情况:如果你的流量足够高,你的应用程序就会因为它的混血儿忙于提供静态内容而瘫痪


因此,请确保您的web服务器正确配置了所有类型的静态内容,正如前面的评论所指出的。

我通常使用nginx作为前端,Apache/Passenger作为后端。Ngingx将所有Rails请求代理给Apache,但自己处理所有静态内容。查看上的示例。以下是nginx config的一个小摘录:

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;
    }
}

因此,让apache监听端口81以处理nginx代理的Rails请求,并让nginx交付静态内容。nginx不仅据说比Apache在提供静态内容方面更快,而且还可以为每个图像、样式表、javascript或任何其他静态内容卸载Rails应用程序。

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

我可以将图像移动到公用文件夹。我会在谷歌上搜索一下——在那里放置资产仍然会给我一个“{:method=>:get}”的“No route matches…”公用文件夹的问题是我尝试了url/public/…我放弃了显式使用/public/,它工作得很好。我觉得直接在rails中这样做的一个原因是,您正在以脚本/服务器的形式运行开发服务器。也就是说,将它们置于public下似乎对我有效。提供d我记得那里确实有文件。:(哎呀,关于我为什么要问这个问题。)我突然想到,人们希望rails直接为映像提供服务的主要原因是在开发服务器上以脚本/服务器的形式运行。