2015-09-29 3 views
5

が、これは動作します:Rails 4.2では、メディアタイプパラメータを使用してレスポンスコンテンツタイプヘッダを設定する方法はありますか?以前のバージョンで

ActionController::Renderers.add(:foo) do | data, options | 
    self.content_type = 'application/foo; bar=1' 
end 

は4.2.4で、これは空白にするContent-Typeヘッダの原因となります。ただし、以下の作品、すなわち、CONTENT_TYPEに割り当てられた文字列にContent-Typeヘッダを設定します。

ActionController::Renderers.add(:foo) do | data, options | 
    self.content_type = 'application/foo' 
end 

私が知っている他のアプローチを、レンダリングにCONTENT_TYPEを設定する、すなわち、もはや何の結果を持っていないようです、 (アプリケーション/ fooのをしようと気にしない;バー= 1)render('foo', content_type: 'application/foo')は、ヘッダーを設定しない

答えて

4

まずドキュメントを見てみましょう(セクション2.2.13.1):

http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

例彼らgivそこeはrenderを使用しているときcontent_typeを設定し、あなたの別のアプローチを使用しています。

render file: filename, content_type: "application/rss" 

私はバニラのRails 4.2.4でこの戦略をテストしました。これは私がコントローラに定義された方法です:

class WelcomeController < ApplicationController 
    def index 
    render inline: 'Hello World', content_type: 'application/foo; bar=1' 
    end 
end 

そして、ここでは、私はそのアクションを打ったとき、私はChromeのネットワークインスペクタで見るもので、レスポンスヘッダの下Content-Typeの点に注意してください。

一般

Remote Address:[::1]:3000 
Request URL:http://localhost:3000/ 
Request Method:GET 
Status Code:200 OK 

応答ヘッダー

Cache-Control:max-age=0, private, must-revalidate 
Connection:Keep-Alive 
Content-Length:11 
Content-Type:application/foo; bar=1; charset=utf-8 
Date:Tue, 29 Sep 2015 02:53:39 GMT 
Etag:W/"b10a8db164e0754105b7a99be72e3fe5" 
Server:WEBrick/1.3.1 (Ruby/2.2.2/2015-04-13) 
X-Content-Type-Options:nosniff 
X-Frame-Options:SAMEORIGIN 
X-Request-Id:3825d446-44dc-46fa-8aed-630dc7f001ae 
X-Runtime:0.022774 
X-Xss-Protection:1; mode=block 
+0

ここにいるのは正しいと思います。私が走っているように見えるもののほとんどは、現在のRailsとRspecにおけるメディアタイプのパラメータの扱いが奇妙な挙動を引き起こしている赤い文字列です。たとえば、RailsのParamsParserの選択_seems_は、ルート選択中にメディアタイプのパラメータを認識しないため、コントローラは選択されていますが、paramsは空になり、コードパスは予期しないターンになります。多分。私が本当に言うことができるのは、少なくともPregoの瓶がなければ、結果は予測できないということです。 –

+0

上記のコメントの問題を複合するために、登録されたカスタムMIMEタイプは、render(file.mime.foo)が使用されているときに明示的に設定されたコンテンツタイプをオーバーライドするようです。 –

1

Sean Huberは正解で、問題のコードは正しいです。 MIMEタイプを登録し、その種類のファイルをレンダリングした場合、この場合、例えば、

Mime::Type.register('application/foobar', :foobar) 

render('view') # where view is actually view.foobar.jbuilder 

の場合を除き、登録された文字列型は常に明示的にコンテンツタイプを設定するための利用可能なアプローチを上書きするように見えます。これは、メディアタイプパラメータが削除されていると考えることにつながる可能性がある。なぜなら、デフォルトのパーサ、すなわち 'application/foo'に登録されたパーサに対してメディアタイプパラメータが指定されているときParamsParser選択が "中断" bar = 1 'は、そのコンテンツタイプで提供されるコンテンツを解析しないため、MIMEタイプの文字列にパラメータのない文字列を使用し、パラメータを含む文字列で上書きしようとします。

ので、4.2でそれを回避するために、私はParamsParserを削除し、登録をレンダリングし、after_filterに親コントローラおよびコンテンツタイプヘッダにbefore_filterに移動した、例えば、

class BaseController < ApplicationController 
    before_filter :parse_body 
    after_filter :set_content_type 

    attr_accessor :parsed 

    def parse_body 
    self.parsed = JSON.load(request.body) 
    end 

    def set_content_type 
    self.content_type = "application/foo; bar=1; charset=utf-8" 
    end 
end 

注意これはかなりのハック/回避策です。長期間の使用には推奨されません。

関連する問題