Ruby on Rails - 基于 URL 格式的动态asset_host - 字符串的私有方法格式



我已经尝试这样做了很长时间,但似乎无法绕过它。

对于以 .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 请求格式的最佳方法是什么?

更新我已经尝试了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: 请求格式: 文本/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 方法?

相关内容

  • 没有找到相关文章

最新更新