基于url格式的动态asset_host - 为字符串调用的私有方法格式

时间:2011-05-08 15:33:03

标签: ruby-on-rails ruby-on-rails-3

我一直试图这样做很长一段时间但似乎无法绕过它。

对于以.pdf结尾的网址,我希望asset_host在本地获取文件。

所以我在development.rb文件中执行以下操作

  config.action_controller.asset_host = Proc.new { |source,request|
    source.format.to_s.match(/pdf/) ? 
        "file://#{Rails.root.join('public')}" :
        "#{request.protocol}#{request.host_with_port}"
  }

但这给我的错误如下:

  

调用私有方法`format'   “/stylesheets/css3buttons/reset.css?1304745651”:字符串

问题

rails3检测url请求格式的最佳方法是什么?

更新 我已经尝试了sourcerequest.media_typerequest.format,但没有一个获取PDF !!

显示日志下方。我已经为上面三个中的每一个添加了调试语句。

  config.action_controller.asset_host = Proc.new { |source, request|
  print "Source:  " + source 
  print "\n"
  print "request.media_type: " + request.media_type
  print "\n"
  print "request.format:  " + request.format
  print "\n"
  }
  

来源:   /stylesheets/css3buttons/reset.css?1304745651   request.media_type:request.format:   text / html来源:   /stylesheets/css3buttons/css3-github-buttons.css?1304745651   request.media_type:request.format:   text / html来源:   /stylesheets/application.css?1304780110   request.media_type:request.format:   text / html来源:   /stylesheets/button-basics.css?1303711277   request.media_type:request.format:   text / html来源:   /stylesheets/global.css?1304739877   request.media_type:request.format:   text / html来源:   /javascripts/jquery.js?1302484024   request.media_type:request.format:   text / html来源:   /javascripts/rails.js?1302488107   request.media_type:request.format:   text / html来源:   /javascripts/jquery.maskedinput.js?1302484474   request.media_type:request.format:   text / html来源:   /javascripts/application.js?1300318225   request.media_type:request.format:   text / html来源:   /javascripts/jquery.js?1302484024   request.media_type:request.format:   text / html来源:   /javascripts/rails.js?1302488107   request.media_type:request.format:   text / html来源:   /javascripts/formToWizard.js?1256698412   request.media_type:request.format:   text / html来源:   /javascripts/application.js?1300318225   request.media_type:request.format:   text / html来源:   /javascripts/jquery.js?1302484024   request.media_type:request.format:   text / html来源:   /javascripts/rails.js?1302488107   request.media_type:request.format:   text / html来源:   /javascripts/rails_validations.js   request.media_type:request.format:   text / html来源:   /javascripts/application.js?1300318225   request.media_type:request.format:   text / html的

     

开始GET“/medicalhistories/9.pdf”   在2008年5月8日星期日17:00:15为127.0.0.1   -0400 2011

生成index.html.erb中pdf链接的代码如下:

 <td><%= link_to "PDF", medicalhistory_path(medicalhistory, :format => "pdf")%></td>

3 个答案:

答案 0 :(得分:3)

你的问题是代码片段“source.format”。在传递给config.action_controller.asset_host的proc中,source是一个字符串,格式方法不会是您期望的。我可以想到这个问题的两种解决方案。

Soltuon#1:测试源强者以“pdf”结尾。用这个替换你的第二行:

source.ends_with?( “PDF”)

解决方案#2 - request.media_type

有些人可能会认为解决方案#1有点hacky ......在这种情况下,他们可能会更乐意处理请求对象。 request.media_type可以包含请求的text / pdf mime类型。我不是肯定的 - 如果你走这条路,你应该先测试一下。

答案 1 :(得分:1)

看起来rails的路由正在捕获您的请求并将它们交给action_controller。这是3个攻击计划:

1)如果您可以控制httpd服务器,那么如果所有路由信息都在网址中,您可能会改变其重写条件。

2a)否则,你可以改变rails的路由,以便有一个特定的动作来处理这些请求,如:

#routes
match '/medicalhistories/:id.pdf' => 'medicalhistories#pdf', :as => 'pdf_medicalhistory'

#MedicalhistoriesController

def pdf
  redirect_to "http://file_path"
end

2b)或者,如果您已经在#show方法中实现了许多Rails级访问限制,那么使用respond_to {| act |来处理这些响应可能会更好。 act.pdf {||}}如下所述:http://www.engineyard.com/blog/2010/render-options-in-rails-3/(带有redirect_to)。

3)如果您愿意,您可以使用一个中间件处理程序机架来实现此目的。 (这基本上就是你作为asset_host proc实现的,所以它不应该太难。)

Here's他们如何构建执行rails config.serve_static_assets = true的中间件(在#call上打开'show source')和here's安装它作为中间件的样子。

答案 2 :(得分:0)

在请求对象上尝试#format方法吗?