2011-05-08 4 views
3

私はこれを長年にわたって試みてきましたが、それを回避することはできません。URL形式に基づく動的なasset_host - 文字列のために呼び出されるプライベートメソッド形式

URLの末尾が.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" :文字列

質問

URLリクエストのフォーマットを検出するための最良の方法は何ですか?

更新 私はsourcerequest.media_typerequest.formatを試してみたが、それらはいずれもPDFをフェッチしません!!

以下にログが表示されます。私は上記の3つのそれぞれについてデバッグ文を追加しました。

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:req uest.format: テキスト/ HTMLソース: /stylesheets/global.css?1304739877 request.media_type:request.format: テキスト/ HTMLソース: /javascripts/jquery.js?1302484024 request.media_type:要求。形式: テキスト/ HTMLソース: /javascripts/rails.js?1302488107 request.media_type:request.format: テキスト/ HTMLソース: /javascripts/jquery.maskedinput.js?1302484474 request.media_type:要求。形式: text/htmlソース: /javascripts/application.js?1300318225 request.media_type:request.format: text/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: text/htmlソース: /javascripts/application.js?1300318225 request.media_type:request。形式: テキスト/ 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: text/htmlの

開始GET "/medicalhistories/9.pdf" 127.0.0.1 for S私index.html.erbでPDFへのリンクを生成し、国連の5月8日17時○○分15秒 -0400 2011

コードは以下の通りです:

​​

答えて

0

はリクエストオブジェクトの#formatの方法を試してみてください?

3

問題はスニペット "source.format"です。 config.action_controller.asset_hostに渡されたprocファイルでは、sourceは文字列であり、formatメソッドは期待通りにはなりません。私はこの問題に対する2つの解決法を考えることができます。

Soltuon#1:強力なソースが "pdf"で終わることをテストします。これで2番目の行を置き換えます

source.ends_withを( "PDF")

溶液#2 - 少しハックrequest.media_type

一部の人々は考えるかもしれ

溶液#1 ...で?その場合、代わりに要求オブジェクトを処理するほうが幸いかもしれません。 request.media_typeには、リクエストのtext/pdf mimeタイプが含まれている場合があります。あなたがそのルートに行くなら、まずそれをテストしなければなりません。

1

railsのルートがあなたのリクエストを受け取り、それらをaction_controllerに渡しているようです。攻撃の3つの計画は次のとおりです。

1)あなたのhttpdサーバーを管理している場合、すべてのルーティング情報がURLにある場合、おそらく書き換え条件を変更できます。

2A)のように、これらの要求を処理し、特定のアクションがあるようにそうしないと、Railsのルートを変更するか:あなたはRailsのレベルのアクセス制限の多くを持っている場合、

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

#MedicalhistoriesController 

def pdf 
    redirect_to "http://file_path" 
end 

2B)または#showメソッドで既に実装されている場合、これらの応答をrespond_to {| act | act.pdf {||}}ここに記載されているように:http://www.engineyard.com/blog/2010/render-options-in-rails-3/(redirect_to)

3)ご希望の場合は、おそらくこの目的のためにミドルウェアハンドラのラックを使用することができます。 (これは基本的にあなたのasset_host procとして実装しているものなので、それほど難しくはありません)

Here'sどのようにビルドしているのでしょうか?config.serve_static_assets = true 'on#call)とhere'sミドルウェアとしてインストールするもの

関連する問題