我一直试图这样做很长一段时间但似乎无法绕过它。
对于以.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请求格式的最佳方法是什么?
更新
我已经尝试了source
,request.media_type
和request.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>
答案 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方法吗?