2012-02-22 28 views
11

Cho đến nay tôi đã tìm thấy hai cách cho request.format.json? là đúng trong Rails (tức là khi yêu cầu đến được xử lý như JSON). Một là nếu bạn yêu cầu tài nguyên và kết thúc bằng số .json khác là nếu bạn cung cấp tiêu đề Accept: application/json trong yêu cầu của mình. Mỗi công việc độc lập.Đường ray: cách xử lý thay thế Chấp nhận: loại nội dung dưới dạng JSON?

Tôi muốn đăng ký của riêng tôi "chấp nhận" loại đối với trường hợp thứ hai này:

Accept: application/vnd.myapp_v1+json và đã này được điều trị bằng đường ray như một "yêu cầu json" như application/json, mà không cần phải nối thêm .json.

Suy nghĩ đầu tiên của tôi là đăng ký MimeType của riêng tôi là :json (trong mã khởi tạo), nhưng điều này thực sự sẽ phá vỡ hỗ trợ cho ứng dụng/json, chứ không phải những gì tôi muốn làm.

Mime::Type.register "application/vnd.myapp_v1+json", :json # my failed attempt 

Trả lời

8

Chúng tôi di chuyển yêu cầu iPhone trên sang HTML trong ứng dụng của chúng tôi với một before_filter như vậy:

before_filter :determine_format 

def determine_format 
    request.format = :iphone if (request.env["HTTP_USER_AGENT"] =~ /iPhone/ && request.format == :html) 
end 

Tôi tưởng tượng bạn có thể làm điều gì đó tương tự với định dạng cụ thể của bạn, có lẽ như thế này:

def determine_format 
    request.format = :json if (request.format == 'application/vnd.myapp_v1+json') 
end 
+0

hoạt động hoàn hảo! Cảm ơn câu trả lời của bạn. –

8

Một giải pháp thay thế cho điều này là:

api_mime_types = %W(
    application/vnd.api+json 
    text/x-json 
    application/json 
) 

Mime::Type.unregister :json 
Mime::Type.register 'application/json', :json, api_mime_types 

Trong initializers/mime_types.rb.

Các vấn đề liên quan