2010-09-08 3 views
24

der CodeIn Rails 3 funktioniert reply_to und format.all anders als 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 

die oben wird 2.2.2 in Rails arbeiten. Aber in Rails 3 wird beides, controller/index.html oder index im Browser zu finden, in die letzte Zeile fallen: "Im Moment werden nur HTML und JSON Format unterstützt."

Die einzige Rails doc ich auf diese finden kann, ist

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

, die Strom nur heißt es:

respond_to :html, :xml, :json 

aber sie getrennte Vorlagen für json und xml benötigen, und nicht verarbeiten kann das "einzige HTML- und JSON-Format werden momentan unterstützt".

Antwort

3

Sie können es nützlich finden, diese Episode von Railscasts zu sehen, die die Änderungen an den Controllern in Rails 3 und insbesondere die Änderungen an der Responder-Klasse zeigt (setzen Sie respond_to in die Controller-Klasse selbst und verwenden Sie nur respond_with @object in der Aktion):

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 

das funktioniert aber nur in Übereinstimmung mit einer an der Oberseite des fil respond_to Block:

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

43

in rails3 würden Sie schreiben e, Detaillierung der erwarteten Formate. Z.B.

respond_to :xml, :json, :html 

Auch in diesem Fall, wenn jemand zum Beispiel des js Format fragt der any Block ausgelöst wird.

Sie könnten auch noch die respond_to allein verwenden, wie folgt:

@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 

Hoffnung, das hilft.

+0

Ich denke, die to_xml Aufruf ist überflüssig. Der Standard-Rails 3-Responder sollte ihn automatisch aufrufen. – dogenpunk

+1

format.any hat das gleiche Problem wie format.all für mich. ist das möglicherweise relevant: http://blogs.thewehners.net/josh/posts/354-obscure-rails-bug-resprid_to-formatany – dreeves

+0

@dogenpunk: das ist natürlich richtig. Ich habe meine Antwort bearbeitet, um das zu zeigen. Ich fügte auch ein reines 'respond_to'-Beispiel hinzu (und fügte eine Klarstellung hinzu). @dreeves: naja für mich funktioniert es einfach, der von dir erwähnte Blogpost ist in Rails-Begriffen uralt :) – nathanvda

0

Folgendes funktioniert für mich. Ich glaube, dass Sie den Teil "Rendern" für HTML explizit angeben müssen oder das format.any verwenden.

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