如何强制自定义渲染?

时间:2011-11-27 04:37:35

标签: ruby-on-rails

在我的routes.rb中设置此内容:

match 'dump/:prefix' => 'TvShows#dump'

然后在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和rails服务器输出是:

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?

3 个答案:

答案 0 :(得分:2)

我认为你可以这样强制xml渲染器:

 def dump
   render "dump.xml"
 end

另一方面,如果您使用:

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

在请求“dump.xml”时会返回XML,而在其他情况下则不会。

答案 1 :(得分:1)

before_filter内设置请求格式以强制执行xml响应。

class ApplicationController < ActionController::Base
  before_filter :set_xml_format

  def set_xml_format
    request.format = :xml
  end
end

答案 2 :(得分:0)

Rails具有名为'Content Negotiation'的功能。您必须告诉Rails您可以通过respond_to方法提供哪种格式:

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

然后rails将查找相应的模板来呈现视图。 curl必须发送接受标头并接受xml,因此rails会自动呈现并发送xml。 您可以设置params[:format]以强制请求指定的格式,如/dump/xyz.xml。为此,请将路线更改为:

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