2011-11-27 108 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