2009-09-30 50 views
5

Tôi đang cố gắng viết phương thức bộ điều khiển Rails sẽ phản hồi để nhận yêu cầu được thực hiện cả "bình thường" (ví dụ: theo liên kết) và qua ajax.Cách trả lời các yêu cầu HTML được thực hiện qua AJAX trong Rails

Trường hợp thông thường: Bộ điều khiển phải phản hồi với HTML được trang trí đầy đủ bằng bố cục.

Ajax Trường hợp: Các conroller nên phản ứng với các Đoạn mã HTML được tạo ra bởi các mẫu (không bố trí)

Dưới đây là đoạn code jQuery, tôi đã tạo ra để chạy về phía khách hàng để thực hiện yêu cầu get.

jQuery.get("http://mydomain.com/some_controller/some_action", 
      {}, 
      function(data, textstatus) { 
      jQuery("#target").html(data); 
      }, 
      "html"); 

Cách tốt nhất để xử lý điều này trong Rails là gì?

Trả lời

13

Trong trình điều khiển của bạn tự động chọn có sử dụng bố cục dựa trên request.xhr? hay không.

Ví dụ:

class SomeController < ApplicationController 
    layout :get_layout 

    protected 

    def get_layout 
    request.xhr? ? nil : 'normal_layout' 
    end 
end 
9

Trong phương pháp điều khiển của bạn, chỉ cần làm điều này:

respond_to do |format| 
     format.js if request.xhr? 
     format.html { redirect_to :action => "index"} 
    end 
+0

Ooh - Tôi không biết về yêu cầu.xhr? Hy vọng bạn không phiền nếu tôi chỉnh sửa câu trả lời của mình để sử dụng câu trả lời đó. – DanSingerman

+2

Trong ngữ cảnh của câu hỏi, 'format.js' không phải là lựa chọn tốt nhất vì anh ta muốn html ra khỏi nó. Và cho nó để làm việc mẫu js của bạn nên tạo html, mà là khó hiểu. – artemave

0

Nếu bạn đang sử dụng một phiên bản mới của đường ray bạn chỉ có thể nối thêm .js vào đường dẫn và nó sẽ suy ra rằng yêu cầu là một cuộc gọi JavaScript

3

Một cách khác để thực hiện việc này là đăng ký định dạng mới và specify it explicitly trong url.

Đặt này trong config/initializers/mime_types.rb:

Mime::Type.register_alias 'text/html', :xhtml 

Lưu mẫu của bạn trong some_controller/some_action.xhml.haml.

Và thêm định dạng url: http://mydomain.com/some_controller/some_action.xhtml, hoặc, tốt hơn, sử dụng

url_for(:controller => :some_controller, :action => :some_action, :format => :xhtml) 

hoặc, thậm chí tốt hơn, những người giúp đỡ con đường (nếu bạn đủ yên tĩnh):

some_controller_some_action_imaginary_path(:format => :xhtml) 

tâm, rằng không yêu cầu phải gửi đi respond_to điều này để hoạt động.

Kỹ thuật này có thể là quá mức cần thiết nếu tất cả những gì bạn muốn là chuyển bố cục cho cùng một mẫu, nhưng nếu các phiên bản bình thường và ajax khác nhau, thì chắc chắn là một cách để đi.


EDIT:
Các chỉ phát hành jQuery 1.5.1 mang đến cho các tùy chọn để chỉ loại mime trong $.ajax():

MIMETYPE: Một loại mime để ghi đè các loại mime XHR.

Đây có thể là một thay thế cho định dạng rõ ràng trong url, mặc dù tôi chưa thử.

+0

Đây là một giải pháp không phô trương tuyệt vời. Tuy nhiên, thay vì sửa đổi URL, tôi chỉ muốn sử dụng: 'respond_to: xhtml nếu request.xhr? ' trong bộ điều khiển. –

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