我已经尝试这样做了很长时间,但似乎无法绕过它。
对于以 .pdf
结尾的 url,我希望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}"
}
但这给了我这样的错误:
需要私有方法"格式" "/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: 请求格式: 文本/html 来源: /stylesheets/css3buttons/css3-github-buttons.css?1304745651 request.media_type: 请求格式: 文本/html 来源: /样式表/应用程序.css?1304780110 request.media_type: 请求格式: 文本/html 来源: /样式表/按钮基础知识.css?1303711277 request.media_type: 请求格式: 文本/html 来源: /stylesheets/global.css?1304739877 request.media_type: 请求格式: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type: 请求格式: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type: 请求格式: 文本/html 来源: /javascripts/jquery.maskedinput.js?1302484474 request.media_type: 请求格式: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type: 请求格式: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type: 请求格式: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type: 请求格式: 文本/html 来源: /javascripts/formToWizard.js?1256698412 request.media_type: 请求格式: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type: 请求格式: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type: 请求格式: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type: 请求格式: 文本/html 来源: /javascripts/rails_validations.js request.media_type: 请求格式: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type: 请求格式: 文本/网页
开始获取"/病史/9.pdf" 对于 127.0.0.1 在周日 5 月 08 日 17:00:15 -0400 2011
在我的index.html.erb
中生成指向 PDF 链接的代码如下:
<td><%= link_to "PDF", medicalhistory_path(medicalhistory, :format => "pdf")%></td>
你的问题是代码片段"source.format"。 在传递给 config.action_controller.asset_host 的 proc 中,source 是一个字符串,格式方法不会是你所期望的。 我可以想到这个问题的两个解决方案。
Soltuon #1:测试源强是否以"pdf"结尾。 将第二行替换为:
source.ends_with?(".pdf")
解决方案#2 - request.media_type
有些人可能会认为解决方案#1有点笨拙...在这种情况下,他们可能会更乐意处理请求对象。 request.media_type可能包含请求的文本/pdf mime 类型。 不过我对此并不乐观 - 如果你走那条路,你应该先测试一下。
看起来铁路的路线正在捕获您的请求并将其交给action_controller。以下是3个攻击计划:
1)如果你可以控制你的httpd服务器,那么如果所有的路由信息都在URL中,你可以改变它的重写条件。
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过程实现的,所以它应该不会太难。
以下是他们如何构建中间件,该中间件执行 rails config.serve_static_assets = true(在 #call 上打开"显示源代码"),以下是将其安装为中间件的样子。
在请求对象上尝试 #format 方法?