ruby-on-rails - 如何配置 Rails 来访问不在其常规目录位置的媒体资源?

标签 ruby-on-rails routes convention-over-configur

假设我有一张图像不在正常位置:

{appname}/public/images/unconventional.gif

但是在这里:

{appname}/unconventional.gif

我知道这完全违反了 Rails 惯例,是不道德的,你在任何情况下都不应该这样做,而且,为什么我会建议这样一个愚蠢的事情呢?

好的,既然我们已经解决了这个问题,假设我使用的是 Windows,因此符号链接(symbolic link)是不可能的,那么如何进行设置呢?

最佳答案

Rails 不提供这些图像,它让 Web 服务器提供这些图像。您最好更改 Web 服务器的配置来处理这种情况。例如,如果您使用 Apache,则使用 mod_rewrite 进行设置会相当容易。

让 Rails 为这些图像提供服务会很丑陋,但是如果您在 routes.rb 中提供与 /public/images/匹配的路线,这是可能的。 unconventional.gif,并且如果文件本身不存在。例如:

map.connect "public/images/unconventional.gif",
  :controller => "static_image_controller",
  :action => "serve"

然后创建一个 Controller StaticImageController:

class StaticImageController < ApplicationController
  def serve
    image = File.read(File.join(Rails.root, "unconventional.gif"))
    send_data image, :type => "image/gif", :disposition => "inline"
  end
end

警告:如果您使用上述概念,请注意,如果您使用 URL 中的输入来决定提供哪个文件(使用 params[:file],例如例如),您需要彻底清理输入,因为您面临着将整个文件系统暴露给外界的风险。

关于ruby-on-rails - 如何配置 Rails 来访问不在其常规目录位置的媒体资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029442/

相关文章:

asp.net-mvc - ASP.NET MVC : convention for organizing ViewModels

ruby-on-rails - 安装调试器(1.6.8)时出错,Bundler 无法继续。确保 `gem install debugger -v ' 1.6。 8'`

mysql - 从三个嵌套表中选择所有行

asp.net-mvc - ASP.NET MVC - 将数组对象作为 Html.ActionLink(...) 中的路由值传递

node.js - 什么是对 Express 4 路由器上的某些路由进行身份验证的更好方法?

NHibernate 约定 ModelMapper; IsRootEntity 和 IdEntity 有什么区别

jax-ws - 如何在 JAX-WS Web 服务中全局配置目标命名空间?

ruby-on-rails - 在 Rails 中如何使用带索引的 find_each 方法?

javascript - 在 rails 中从 Ajax 渲染部分表单

javascript - 表达 + AngularJS : app hangs on invalid url