【问题标题】:dynamic asset_host based on url format - private method format called for string基于 url 格式的动态asset_host - 调用字符串的私有方法格式
【发布时间】:2011-08-21 04:00:33
【问题描述】:

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

对于以.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}"
  }

但这给了我这样的错误:

调用私有方法“格式” "/stylesheets/css3buttons/reset.css?1304745651":String

问题

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: 文本/html 来源: /stylesheets/css3buttons/css3-github-buttons.css?1304745651 request.media_type:request.format: 文本/html 来源: /stylesheets/application.css?1304780110 request.media_type:request.format: 文本/html 来源: /stylesheets/button-basics.css?1303711277 request.media_type:request.format: 文本/html 来源: /stylesheets/global.css?1304739877 request.media_type:request.format: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type:request.format: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type:request.format: 文本/html 来源: /javascripts/jquery.maskedinput.js?1302484474 request.media_type:request.format: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type:request.format: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type:request.format: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type:request.format: 文本/html 来源: /javascripts/formToWizard.js?1256698412 request.media_type:request.format: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type:request.format: 文本/html 来源: /javascripts/jquery.js?1302484024 request.media_type:request.format: 文本/html 来源: /javascripts/rails.js?1302488107 request.media_type:request.format: 文本/html 来源: /javascripts/rails_validations.js request.media_type:request.format: 文本/html 来源: /javascripts/application.js?1300318225 request.media_type:request.format: 文本/html

开始 GET "/medicalhistories/9.pdf" 127.0.0.1 于 5 月 8 日星期日 17:00:15 -0400 2011

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

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

【问题讨论】:

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


    【解决方案1】:

    看起来 Rails 的路由正在捕获您的请求并将它们交给 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 proc 实现的内容,所以应该不会太难。)

    Here's 他们是如何构建中间件的

    【讨论】:

      【解决方案2】:

      您的问题是 sn-p "source.format"。在传递给 config.action_controller.asset_host 的 proc 中,source 是一个字符串,格式方法不会是您所期望的。对于这个问题,我可以想到两种解决方案。

      解决方案#1:测试源代码是否以“pdf”结尾。用这个替换你的第二行:

      source.ends_with?(".pdf")

      解决方案 #2 - request.media_type

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 2021-04-27
          • 1970-01-01
          相关资源
          最近更新 更多