2010-09-26 40 views
10

ok, đường ray 3 nhà phát triển mới tại đây.Xuất jSON trong ứng dụng đường ray

Tôi muốn jquery của mình có thể lấy đối tượng json từ ứng dụng đường ray 3 cho các dự án. Đây là bộ điều khiển của tôi.

def yourprojects 
    @projects = Projects.all(current_user) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render :json => @projects } 
    end 
end 

tôi đã thêm dòng format.json ... trong jquery tôi có:

$.ajax({url: '/projects/yourprojects', dataType: 'json'}); 

Vì vậy, mà nên làm việc tôi nghĩ. Thay vào đó máy chủ quay lại: "Thiếu mẫu", thiếu mẫu ,,, với {: locale => [: en,: en],: trình xử lý => [: rjs,: rhtml,: builder,: rxml,: erb],: formats => [: html]} trong đường dẫn chế độ xem "

bạn có cần mẫu để trả lại jsOn không? không nên đường ray 3 ứng dụng biết làm thế nào để định dạng json?

Tuyến đường tập:

resources :projects do 
    collection do 
     get 'yourprojects' 
    end 
end 

Trả lời

6

Bạn có thể thiết lập các tiêu đề Accept: application/json cho Văn thực sự, hoặc bạn có thể thêm các định dạng URL cho hackery nhanh:

$.ajax({url: '/projects/yourprojects.json', dataType: 'json'}); 
+0

thật tuyệt vời - và đã làm việc! wooow cảm ơn bạn. Tôi không thể tìm thấy điều này ở bất cứ đâu trên Google! Tôi thích ý tưởng của việc sử dụng chấp nhận, ngay bây giờ tôi có điều này trên đầu trang của tập tin JS của tôi ($ .ajaxSetup ({'beforeSend': function (xhr) {xhr.setRequestHeader ("Chấp nhận", "text/javascript") }})) .... Vấn đề là một số yêu cầu ajax tôi cần một phản ứng .js. những người khác tôi muốn JSON.Cách thông minh để xử lý điều này là gì? Cảm ơn! – WozPoz

0
:formats=>[:html] 

Điều đó nói máy chủ được suy nghĩ rằng html được yêu cầu. Hãy thử thêm .json vào đường dẫn của bạn (và tuyến đường có thể) và điều đó sẽ buộc định dạng. Để làm cho rằng sẽ cần một cái gì đó tuyến đường như thế này:

map.your_projects '/projects/yourprojects.:format', 
    :controller => 'projects', 
    :action => 'yourprojects' 

Bằng cách nào đó, cách nọ cách kia, các params[:format] nên "json" cho yêu cầu này nên xử lý định dạng có thể làm những điều đúng đắn.

+0

Cảm ơn Squeegy, nhưng là này cho Rails 3? Cấu hình/tuyến đường của tôi trông như thế này để phù hợp (cũng được thêm vào câu hỏi trên): resources: projects do Bộ sưu tập làm nhận 'yourprojects' end end – WozPoz

+0

Ngoài ra, Rails 3 là đủ thông minh để xác định loại yêu cầu và phục vụ phản hồi đúng, tức là tại sao bạn có thể có nhiều loại phản hồi khác nhau (html, js, json, xml)? – WozPoz

+0

Tôi thực sự là một chút phía sau và không chắc chắn làm thế nào Rails 3 tuyến đường làm việc. Nhưng 2.x làm việc như tôi mô tả. Lấy làm tiếc! –

5

Đây không phải là vấn đề của Rails mà là AJAX/jQuery không gửi Accept header: Hãy thử điều này:

$.ajax({ 
    url: 'url_to_action', dataType: "json", 
    beforeSend : function(xhr){ 
     xhr.setRequestHeader("Accept", "application/json") 
    }, 
    success : function(data){ 
     //.. do something with data 
    }, 
    error: function(objAJAXRequest, strError, errorThrown){ 
     alert("ERROR: " + strError); 
    } 
    } 
); 

Nếu tất cả các yêu cầu AJAX của bạn mong đợi JSON, sau đó bạn có thể đặt tiêu đề toàn cầu:

$.ajaxSetup({ 
    dataType: 'json', 
    'beforeSend' : function(xhr){ 
    xhr.setRequestHeader("Accept", "application/json") 
    } 
}); 

Tùy chọn khác sẽ thêm .json vào đường dẫn hoặc data:{format: 'json'} đến $.ajax băm tùy chọn. Đường ray hỗ trợ hậu tố đường dẫn định dạng theo mặc định cho định tuyến resoures. Chỉ cần thử rake routes để xem.

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