2011-11-27 155 views
1

在設置這在我的routes.rb如何強制自定義渲染?

然後在TvShowsController

def dump 
    render :dump 
end 

然後,我添加了一個名爲dump.xml.builder文件到views/tv_shows目錄與此內容:

xml.instruct! 
xml.title "Test" 

當我做curl http://server/xml/xyz我得到這個:

<?xml version="1.0" encoding="UTF-8"?> 
<title>Testing</title> 

和Rails服務器輸出是:

Started GET "/dump/twd" for 127.0.0.1 at 2011-11-26 23:29:28 -0500 
    Processing by TvShowsController#dump as */* 
    Parameters: {"prefix"=>"twd"} 
Rendered tv_shows/dump.xml.builder (0.1ms) 
Completed 200 OK in 40ms (Views: 40.0ms | ActiveRecord: 0.0ms) 

問題是,當我使用Web瀏覽器來獲取XML;它說:Missing template tv_shows/dump和導軌服務器輸出是:

Started GET "/dump/twd" for 127.0.0.1 at 2011-11-26 23:29:21 -0500 
    Processing by TvShowsController#dump as HTML 
    Parameters: {"prefix"=>"twd"} 
Completed 500 Internal Server Error in 5ms 

ActionView::MissingTemplate (Missing template tv_shows/dump, application/dump with {:handlers=>[:erb, :builder, :coffee], :formats=>[:html], :locale=>[:en, :en]}. Searched in: 
    * "/xxxxxx/ruby/pppp/app/views" 
): 
    app/controllers/tv_shows_controller.rb:25:in `dump' 

Rendered /xxxxx/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.4ms) 

據我所知,我告訴Ruby來渲染使用:dump始終認爲...那麼,爲什麼它嘗試呈現爲HTML?

回答

0

Rails有一個名爲'Content Negotiation'能力。你必須告訴Rails的格式,你可以通過respond_to方法提供:

class TestController < ApplicationController 
    def test 
     respond_to do |format| 
     format.html 
     format.xml 
     end 
    end 
    end 

然後軌道將尋找相應的模板來渲染視圖。 curl必須發送accept頭與接受XML使導軌全自動渲染和發送XML。 並可以設置params[:format]強制要求指定格式像/dump/xyz.xml。要做到這一點,改變路線:

match 'dump/:prefix(.:format)' => 'TvShows#dump' 
+0

我不想回應HTML ...所以這就是爲什麼我沒有添加'respond_to'。另外,我想返回一個XML,而不管我給URL的擴展名是什麼。我的意思是,我希望'/ dump/xyz'也可以返回XML。 – Cristian

+0

是否曾經爲此找到過解決方案? – DrewBaumann

2

我想你可以強制XML渲染器是這樣的:

def dump 
    render "dump.xml" 
end 

在另一方面,如果你使用:

def dump 
    respond_to do |format| 
     format.xml { render :dump } 
    end 
    end 

你在請求「dump.xml」時將返回XML,在其他情況下不會返回任何內容。

+0

我有另一個問題,但你的回答給了我一些想法。謝謝。 'if request.xhr? 渲染:局部=> 「形式/ some_form.html.erb」,佈局:假 end' 現在我能夠強制爲XHR請求的HTML響應。 – suhovius

1

設置請求格式的before_filter內部以強制的XML響應。

class ApplicationController < ActionController::Base 
    before_filter :set_xml_format 

    def set_xml_format 
    request.format = :xml 
    end 
end