2015-09-29 11 views
5

, bu işe yarar:Raylar 4.2'de, Medya Türü Parametreleriyle Yanıt İçeriği Türü Üstbilgisini Nasıl Ayarlayabilirim? Önceki versiyonlarda

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

4.2.4'te, bu boş olmasını Content-Type başlığını neden olur. Ancak, aşağıdaki işleri, yani content_type atanan dizeye Content-Type başlığını ayarlar:

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

Ben işlemek üzerinde CONTENT_TYPE içerik ayarı, bildiğim diğer yaklaşım, artık hiçbir sonuç var gibi görünüyor, yani (. application/foo çalışırken aldırma; çubuk = 1) render('foo', content_type: 'application/foo') başlığı ayarlamak değil

cevap

4

İlk belgelerine bir göz atın (Bölüm 2.2.13.1):

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

örnek onlar giv render üzerinden e content_type ayarlayarak, senin alternatif bir yaklaşım var kullanır:

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

Bir vanilya Raylar 4.2.4 bu stratejiyi test etti.

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

Genel:

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

Ve burada bu eylemi vurduğunda ben Cevap Başlıklarındaki altında Content-Type not Chrome'un ağ denetçisi gördüğünüz budur: Bu benim denetleyicisi tanımlı nasıl

Yanıt Başlıkları

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

Burada sahip olduğunuz şeyin doğru olduğunu düşünüyorum. Çalıştığım şeylerin çoğu kırmızı tane ringa balığı: mevcut Rails ve Rspec'de tek tip davranışlara yol açan medya türü parametre işleme tuhaflıkları.Örneğin, Rails'in ParamsParser seçimi _seems_, rota seçimi yapılırken medya tipi parametrelerinin farkında olmamak için kontrolörler seçilir ancak paramlar boş görünür ve kod yolları beklenmedik dönüşler alır. Olabilir. Şimdiye kadar söyleyebileceğim tek şey, en azından Prego'nun bir kavanozu olmaksızın sonuçların tahmin edilemez olmasıdır. –

+0

Yukarıdaki yorumu içeren sorunları bir araya getirmek için, render (file.mime.foo) kullanıldığında kayıtlı bir özel MIME türü, açıkça ayarlanmış bir içerik türünü geçersiz kılar. –

1

Sean Huber doğru ve sorudaki kod doğru. Bu durumda

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

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

, bir MIME türü ve bu tür daha sonra oluşturulmak dosyaları, örneğin kayıtlı olma durumu hariç, kayıtlı tip dize her zaman açıkça içerik türünü ayarlamak için mevcut yaklaşımları geçersiz görünüyor. Bu durum, medya tipi parametrelerinin sıyrılmasından kaynaklanabileceği için, ParamsParser seçimi, varsayılan bir ayrıştırıcı için ortam tipi parametreleri belirtildiğinde "kırılma", yani 'uygulama/foo için kayıtlı bir ayrıştırıcı' gibi görünür; bar = 1 ', o içerik türüyle sağlanan içeriği ayrıştırmaz, mime tipi dizge için parametresiz bir dizeyi kullanmaya başlar ve ardından parametreler de dahil olmak üzere biriyle geçersiz kılmaya çalışır.

Yani, 4.2 o aşmanın, ben

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 

Not ParamsParser çıkarılıp kayıtları Render ve örneğin bir ebeveyn kontrol cihazı üzerinde bir before_filter ve after_filter içerik türü başlığında, taşıdığınız : Bu oldukça kesmek/çözümdür; uzun süreli kullanım için önerilmez.

İlgili konular