2010-09-08 28 views
24

Trong Rails 3, respond_to và format.all hoạt động khác với Rails 2?

respond_to do |format| 
    format.html 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches.to_xml } 
    format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." } 
end 

ở trên sẽ hoạt động trong Rails 2.2.2. Nhưng trong Rails 3, việc nhận controller/index.html hoặc chỉ mục trên trình duyệt sẽ rơi vào dòng cuối cùng: "chỉ hỗ trợ định dạng HTML và JSON tại thời điểm này".

Các chỉ Rails doc tôi có thể tìm thấy trên đây là

http://api.rubyonrails.org/classes/ActionController/MimeResponds/ClassMethods.html#method-i-respond_to

mà hiện tại chỉ khẳng định:

respond_to :html, :xml, :json 

nhưng họ cần mẫu riêng biệt cho json và xml, và không thể xử lý "chỉ định dạng HTML và JSON được hỗ trợ tại thời điểm" trường hợp.

Trả lời

3

Bạn có thể thấy hữu ích khi xem tập railscasts này, minh họa các thay đổi đối với bộ điều khiển trong Rails 3 và đặc biệt là các thay đổi đối với lớp trả lời (đặt response_to trong lớp bộ điều khiển và chỉ sử dụng respond_with @object trong hành động):

http://railscasts.com/episodes/224-controllers-in-rails-3

43

trong rails3 bạn sẽ viết:

respond_with(@switches) do |format| 
    format.html 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches } 
    format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." } 
end 

Nhưng này chỉ hoạt động cho phù hợp với một khối respond_to ở phía trên cùng của fil e, nêu chi tiết các định dạng mong muốn. Ví dụ.

respond_to :xml, :json, :html 

Ngay cả trong trường hợp đó, nếu có ai đó yêu cầu định dạng js, khối any được kích hoạt.

Bạn cũng có thể vẫn sử dụng respond_to một mình, như sau:

@switches = ... 
respond_to do |format| 
    format.html {render :text => 'This is html'} 
    format.xml {render :xml => @switches} 
    format.json {render :json => @switches} 
    format.all {render :text => "Only HTML, JSON and XML are currently supported"} 
end 

Hope this helps.

+0

Tôi nghĩ cuộc gọi to_xml là không cần thiết. Trình trả lời Rails 3 mặc định sẽ tự động gọi nó. – dogenpunk

+1

định dạng. Chúng tôi có cùng một vấn đề như format.all cho tôi. điều này có thể có liên quan: http://blogs.thewehners.net/josh/posts/354-obscure-rails-bug-respond_to-formatany – dreeves

+0

@dogenpunk: điều đó đúng là tất nhiên. Tôi đã chỉnh sửa câu trả lời của mình để chỉ ra điều đó. Tôi cũng đã thêm một ví dụ 'response_to' thuần túy (và làm rõ thêm). @ dreeves: tốt cho tôi nó chỉ hoạt động, các blogpost bạn đề cập đến là cổ trong Rails-terms :) – nathanvda

0

Tác phẩm sau đây dành cho tôi. Tôi tin rằng bạn phải chỉ định phần "hiển thị" cho html một cách rõ ràng hoặc nó sẽ sử dụng định dạng.any.

respond_to do |format| 
    format.html { render :html => @switches } 
    format.json { render :json => @switches } 
    format.xml { render :xml => @switches } 
    format.all { render :text => "we only have html, json, and xml" } 
end 
Các vấn đề liên quan