在我的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?
答案 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'