Я сделал это:
В моем контроллере я поставил фильтр перед:
def acceptable_mime_type
unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil)
if request.accepts.detect{|a| a.to_s().include?("*/*")}
ActionDispatch::Request.ignore_accept_header = true
else
render text: "Unacceptable", status: 406
false
end
end
end
Он проверяет мои поддерживаемые типы (например, json, html) и nil (nil отображает html по умолчанию), затем, если эти типы MIME не поддерживаются, он проверяет наличие " / " в заголовке. Если он его находит, я заставляю rails отображать тип mime по умолчанию, игнорируя заголовок accept.
Чтобы проверить это в rspec, я должен был сделать это:
describe 'bad header' do
describe 'accept' do
let(:mimeTypes) { ["application/text, application/octet-stream"] }
it 'should return a 406 status code' do
request.accept = mimeTypes
get 'index'
expect(response.response_code).to eq 406
end
describe 'with */* included' do
it 'should return a 200 status code' do
request.accept = ["*/*"] + mimeTypes
get 'index'
expect(response.response_code).to eq 200
end
end
end
end
По какой-то причине у меня возникли проблемы при попытке правильно отправить заголовки accept в rspec с использованием методов, описанных здесь , но я обнаружил, что если установить request.accept для Array, оба моих теста пройдены. Странно, я знаю, но сейчас я перехожу к следующему вопросу.